{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d22b2168-17c7-4a77-89d1-b928f3b7d41c",
   "metadata": {},
   "source": [
    "# Redshift\n",
    "\n",
    "```{important}\n",
    "`sqlalchemy-redshift` requires SQLAlchemy 1.x (as of version 0.8.14)\n",
    "```\n",
    "\n",
    "This tutorial will show you how to use JupySQL with [Redshift](https://aws.amazon.com/redshift/), a data warehouse service provided by AWS.\n",
    "\n",
    "## Pre-requisites\n",
    "\n",
    "First, let's install the required packages."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "104f9ccb-1ce8-4850-a0f0-520cf445b292",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install jupysql sqlalchemy-redshift redshift-connector 'sqlalchemy<2' --quiet"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06edf8cd-6c65-4018-a818-47037c3ae831",
   "metadata": {},
   "source": [
    "Load JupySQL:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ba102937-c7bd-48a4-aec0-999794519b02",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Found pyproject.toml from &#x27;/Users/eduardo/dev/jupysql&#x27;</span>"
      ],
      "text/plain": [
       "Found pyproject.toml from '/Users/eduardo/dev/jupysql'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%load_ext sql"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "759e70ec-7afd-4508-a49a-cd3f41ca3092",
   "metadata": {},
   "source": [
    "## Connect to Redshift\n",
    "\n",
    "Here, we create a connection and pass it to JupySQL:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "759a61b2-4c50-4a76-b1b2-85dd3d082308",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from os import environ\n",
    "from sqlalchemy import create_engine\n",
    "from sqlalchemy.engine import URL\n",
    "\n",
    "user = environ[\"REDSHIFT_USERNAME\"]\n",
    "password = environ[\"REDSHIFT_PASSWORD\"]\n",
    "host = environ[\"REDSHIFT_HOST\"]\n",
    "\n",
    "url = URL.create(\n",
    "    drivername=\"redshift+redshift_connector\",\n",
    "    username=user,\n",
    "    password=password,\n",
    "    host=host,\n",
    "    port=5439,\n",
    "    database=\"dev\",\n",
    ")\n",
    "\n",
    "engine = create_engine(url)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "07768b48-2c43-4fc3-a009-d87826d8b2be",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%sql engine --alias redshift-sqlalchemy"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e5c7085a-cc78-4217-9671-5027a90bf911",
   "metadata": {},
   "source": [
    "## Load data\n",
    "\n",
    "We'll load some sample data. First, we create the table:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "2c0bf0c1-b40c-4415-8387-3df77af874ba",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;redshift-sqlalchemy&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'redshift-sqlalchemy'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "    </tbody>\n",
       "</table>\n",
       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
      ],
      "text/plain": [
       "++\n",
       "||\n",
       "++\n",
       "++"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "DROP TABLE taxi;\n",
    "\n",
    "CREATE TABLE taxi  (\n",
    "    VendorID                BIGINT,\n",
    "    tpep_pickup_datetime    TIMESTAMP,\n",
    "    tpep_dropoff_datetime   TIMESTAMP,\n",
    "    passenger_count         DOUBLE PRECISION,\n",
    "    trip_distance           DOUBLE PRECISION,\n",
    "    RatecodeID              DOUBLE PRECISION,\n",
    "    store_and_fwd_flag      VARCHAR(1),\n",
    "    PULocationID            BIGINT,\n",
    "    DOLocationID            BIGINT,\n",
    "    payment_type            BIGINT,\n",
    "    fare_amount             DOUBLE PRECISION,\n",
    "    extra                   DOUBLE PRECISION,\n",
    "    mta_tax                 DOUBLE PRECISION,\n",
    "    tip_amount              DOUBLE PRECISION,\n",
    "    tolls_amount            DOUBLE PRECISION,\n",
    "    improvement_surcharge   DOUBLE PRECISION,\n",
    "    total_amount            DOUBLE PRECISION,\n",
    "    congestion_surcharge    DOUBLE PRECISION,\n",
    "    airport_fee             DOUBLE PRECISION\n",
    ");"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29eaffd7-49f9-4a78-8347-88001eefcf49",
   "metadata": {},
   "source": [
    "Now, we use `COPY` to copy a `.parquet` file stored in an S3 bucket:\n",
    "\n",
    "```{admonition} Instructions to upload to S3\n",
    ":class: tip, dropdown\n",
    "\n",
    "If you don't have existing data and a role configured, here are the commands to do it:\n",
    "\n",
    "Create bucket:\n",
    "\n",
    "~~~sh\n",
    "aws s3api create-bucket --bucket {bucket-name} --region {aws-region}\n",
    "~~~\n",
    "\n",
    "Download some sample data from [here](https://www.nyc.gov/site/tlc/about/tlc-trip-record-data.page).\n",
    "\n",
    "Upload to the S3 bucket:\n",
    "\n",
    "~~~sh\n",
    "aws s3 cp path/to/data.parquet s3://{bucket-name}/data.parquet\n",
    "~~~\n",
    "\n",
    "Create a role that allows Redshift to  have S3 read access:\n",
    "\n",
    "~~~sh\n",
    "aws iam create-role --role-name {role-name} \\\n",
    "    --assume-role-policy-document '{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"redshift.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}'\n",
    "    \n",
    "aws iam attach-role-policy --role-name {role-name} --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess\n",
    "~~~\n",
    "\n",
    "Then, go to the Redshift console and attach the role you created to your Redshift cluster.\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "104cca47-2474-47aa-b7a5-ab358b1097d4",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": []
    }
   ],
   "source": [
    "%%sql\n",
    "COPY taxi\n",
    "FROM 's3:///some-bucket/yellow_tripdata_2023-01.parquet'\n",
    "IAM_ROLE 'arn:aws:iam::XYZ:role/some-role'\n",
    "FORMAT AS PARQUET;"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56790755-6ac3-45d6-b4e0-1d34150ab793",
   "metadata": {},
   "source": [
    "## Query"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "98e6ca1d-09d6-4676-8a01-f2e7d84111e7",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;redshift-sqlalchemy&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'redshift-sqlalchemy'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>vendorid</th>\n",
       "            <th>tpep_pickup_datetime</th>\n",
       "            <th>tpep_dropoff_datetime</th>\n",
       "            <th>passenger_count</th>\n",
       "            <th>trip_distance</th>\n",
       "            <th>ratecodeid</th>\n",
       "            <th>store_and_fwd_flag</th>\n",
       "            <th>pulocationid</th>\n",
       "            <th>dolocationid</th>\n",
       "            <th>payment_type</th>\n",
       "            <th>fare_amount</th>\n",
       "            <th>extra</th>\n",
       "            <th>mta_tax</th>\n",
       "            <th>tip_amount</th>\n",
       "            <th>tolls_amount</th>\n",
       "            <th>improvement_surcharge</th>\n",
       "            <th>total_amount</th>\n",
       "            <th>congestion_surcharge</th>\n",
       "            <th>airport_fee</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>2</td>\n",
       "            <td>2023-01-01 01:11:31</td>\n",
       "            <td>2023-01-01 01:21:50</td>\n",
       "            <td>1.0</td>\n",
       "            <td>4.59</td>\n",
       "            <td>1.0</td>\n",
       "            <td>N</td>\n",
       "            <td>132</td>\n",
       "            <td>139</td>\n",
       "            <td>2</td>\n",
       "            <td>-20.5</td>\n",
       "            <td>-1.0</td>\n",
       "            <td>-0.5</td>\n",
       "            <td>0.0</td>\n",
       "            <td>0.0</td>\n",
       "            <td>-1.0</td>\n",
       "            <td>-24.25</td>\n",
       "            <td>0.0</td>\n",
       "            <td>-1.25</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>2</td>\n",
       "            <td>2023-01-01 01:11:31</td>\n",
       "            <td>2023-01-01 01:21:50</td>\n",
       "            <td>1.0</td>\n",
       "            <td>4.59</td>\n",
       "            <td>1.0</td>\n",
       "            <td>N</td>\n",
       "            <td>132</td>\n",
       "            <td>139</td>\n",
       "            <td>2</td>\n",
       "            <td>20.5</td>\n",
       "            <td>1.0</td>\n",
       "            <td>0.5</td>\n",
       "            <td>0.0</td>\n",
       "            <td>0.0</td>\n",
       "            <td>1.0</td>\n",
       "            <td>24.25</td>\n",
       "            <td>0.0</td>\n",
       "            <td>1.25</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>2</td>\n",
       "            <td>2023-01-01 01:06:46</td>\n",
       "            <td>2023-01-01 01:42:58</td>\n",
       "            <td>5.0</td>\n",
       "            <td>6.8</td>\n",
       "            <td>1.0</td>\n",
       "            <td>N</td>\n",
       "            <td>68</td>\n",
       "            <td>179</td>\n",
       "            <td>1</td>\n",
       "            <td>36.6</td>\n",
       "            <td>1.0</td>\n",
       "            <td>0.5</td>\n",
       "            <td>8.32</td>\n",
       "            <td>0.0</td>\n",
       "            <td>1.0</td>\n",
       "            <td>49.92</td>\n",
       "            <td>2.5</td>\n",
       "            <td>0.0</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>\n",
       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
      ],
      "text/plain": [
       "+----------+----------------------+-----------------------+-----------------+---------------+------------+--------------------+--------------+--------------+--------------+-------------+-------+---------+------------+--------------+-----------------------+--------------+----------------------+-------------+\n",
       "| vendorid | tpep_pickup_datetime | tpep_dropoff_datetime | passenger_count | trip_distance | ratecodeid | store_and_fwd_flag | pulocationid | dolocationid | payment_type | fare_amount | extra | mta_tax | tip_amount | tolls_amount | improvement_surcharge | total_amount | congestion_surcharge | airport_fee |\n",
       "+----------+----------------------+-----------------------+-----------------+---------------+------------+--------------------+--------------+--------------+--------------+-------------+-------+---------+------------+--------------+-----------------------+--------------+----------------------+-------------+\n",
       "|    2     | 2023-01-01 01:11:31  |  2023-01-01 01:21:50  |       1.0       |      4.59     |    1.0     |         N          |     132      |     139      |      2       |    -20.5    |  -1.0 |   -0.5  |    0.0     |     0.0      |          -1.0         |    -24.25    |         0.0          |    -1.25    |\n",
       "|    2     | 2023-01-01 01:11:31  |  2023-01-01 01:21:50  |       1.0       |      4.59     |    1.0     |         N          |     132      |     139      |      2       |     20.5    |  1.0  |   0.5   |    0.0     |     0.0      |          1.0          |    24.25     |         0.0          |     1.25    |\n",
       "|    2     | 2023-01-01 01:06:46  |  2023-01-01 01:42:58  |       5.0       |      6.8      |    1.0     |         N          |      68      |     179      |      1       |     36.6    |  1.0  |   0.5   |    8.32    |     0.0      |          1.0          |    49.92     |         2.5          |     0.0     |\n",
       "+----------+----------------------+-----------------------+-----------------+---------------+------------+--------------------+--------------+--------------+--------------+-------------+-------+---------+------------+--------------+-----------------------+--------------+----------------------+-------------+"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "SELECT * FROM taxi LIMIT 3"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d41ee487-3a33-466b-a6b7-7de780b4f78f",
   "metadata": {},
   "source": [
    "## Pandas/Polars integration\n",
    "\n",
    "```{tip}\n",
    "Learn more about the [`pandas`](pandas.md) and [`polars`](polars.md) integrations.\n",
    "```\n",
    "\n",
    "You can convert results to pandas and polars data frames"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "1fd40003-ebe6-4dc2-bc4d-09c536f1a154",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;redshift-sqlalchemy&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'redshift-sqlalchemy'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%sql results <<\n",
    "SELECT tpep_pickup_datetime, tpep_dropoff_datetime FROM taxi LIMIT 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "3670b9ab-323e-44e3-8e62-02d796ced8c2",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tpep_pickup_datetime</th>\n",
       "      <th>tpep_dropoff_datetime</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2023-01-01 01:30:53</td>\n",
       "      <td>2023-01-01 02:03:29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2023-01-01 01:28:54</td>\n",
       "      <td>2023-01-01 01:53:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2023-01-01 01:54:52</td>\n",
       "      <td>2023-01-01 02:00:54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2023-01-01 01:25:54</td>\n",
       "      <td>2023-01-01 01:35:49</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2023-01-01 01:54:10</td>\n",
       "      <td>2023-01-01 02:11:43</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  tpep_pickup_datetime tpep_dropoff_datetime\n",
       "0  2023-01-01 01:30:53   2023-01-01 02:03:29\n",
       "1  2023-01-01 01:28:54   2023-01-01 01:53:11\n",
       "2  2023-01-01 01:54:52   2023-01-01 02:00:54\n",
       "3  2023-01-01 01:25:54   2023-01-01 01:35:49\n",
       "4  2023-01-01 01:54:10   2023-01-01 02:11:43"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results.DataFrame().head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "f0ead1d2-3eae-45f8-9ddf-bec7b30c8821",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><style>\n",
       ".dataframe > thead > tr > th,\n",
       ".dataframe > tbody > tr > td {\n",
       "  text-align: right;\n",
       "}\n",
       "</style>\n",
       "<small>shape: (5, 2)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>tpep_pickup_datetime</th><th>tpep_dropoff_datetime</th></tr><tr><td>datetime[μs]</td><td>datetime[μs]</td></tr></thead><tbody><tr><td>2023-01-01 01:30:53</td><td>2023-01-01 02:03:29</td></tr><tr><td>2023-01-01 01:28:54</td><td>2023-01-01 01:53:11</td></tr><tr><td>2023-01-01 01:54:52</td><td>2023-01-01 02:00:54</td></tr><tr><td>2023-01-01 01:25:54</td><td>2023-01-01 01:35:49</td></tr><tr><td>2023-01-01 01:54:10</td><td>2023-01-01 02:11:43</td></tr></tbody></table></div>"
      ],
      "text/plain": [
       "shape: (5, 2)\n",
       "┌──────────────────────┬───────────────────────┐\n",
       "│ tpep_pickup_datetime ┆ tpep_dropoff_datetime │\n",
       "│ ---                  ┆ ---                   │\n",
       "│ datetime[μs]         ┆ datetime[μs]          │\n",
       "╞══════════════════════╪═══════════════════════╡\n",
       "│ 2023-01-01 01:30:53  ┆ 2023-01-01 02:03:29   │\n",
       "│ 2023-01-01 01:28:54  ┆ 2023-01-01 01:53:11   │\n",
       "│ 2023-01-01 01:54:52  ┆ 2023-01-01 02:00:54   │\n",
       "│ 2023-01-01 01:25:54  ┆ 2023-01-01 01:35:49   │\n",
       "│ 2023-01-01 01:54:10  ┆ 2023-01-01 02:11:43   │\n",
       "└──────────────────────┴───────────────────────┘"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results.PolarsDataFrame().head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b071dc7-8474-409a-bdbe-f6218b6e3d78",
   "metadata": {},
   "source": [
    "## List tables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "57119ec7-6507-4441-ac12-b61b9f8ea973",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>Name</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>taxi</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+------+\n",
       "| Name |\n",
       "+------+\n",
       "| taxi |\n",
       "+------+"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sqlcmd tables"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d43bb0c-6344-4460-987a-f620c0d41675",
   "metadata": {},
   "source": [
    "## List columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "51c8cd0c-ac52-4e18-81df-a1d344b97d4a",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>name</th>\n",
       "            <th>type</th>\n",
       "            <th>nullable</th>\n",
       "            <th>default</th>\n",
       "            <th>autoincrement</th>\n",
       "            <th>comment</th>\n",
       "            <th>info</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>vendorid</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{&#x27;encode&#x27;: &#x27;az64&#x27;}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tpep_pickup_datetime</td>\n",
       "            <td>TIMESTAMP</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{&#x27;encode&#x27;: &#x27;az64&#x27;}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tpep_dropoff_datetime</td>\n",
       "            <td>TIMESTAMP</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{&#x27;encode&#x27;: &#x27;az64&#x27;}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>passenger_count</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>trip_distance</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>ratecodeid</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>store_and_fwd_flag</td>\n",
       "            <td>VARCHAR(1)</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{&#x27;encode&#x27;: &#x27;lzo&#x27;}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>pulocationid</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{&#x27;encode&#x27;: &#x27;az64&#x27;}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>dolocationid</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{&#x27;encode&#x27;: &#x27;az64&#x27;}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>payment_type</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{&#x27;encode&#x27;: &#x27;az64&#x27;}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>fare_amount</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>extra</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>mta_tax</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tip_amount</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tolls_amount</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>improvement_surcharge</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>total_amount</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>congestion_surcharge</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>airport_fee</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "            <td>{}</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+-----------------------+------------------+----------+---------+---------------+---------+--------------------+\n",
       "|          name         |       type       | nullable | default | autoincrement | comment |        info        |\n",
       "+-----------------------+------------------+----------+---------+---------------+---------+--------------------+\n",
       "|        vendorid       |      BIGINT      |   True   |   None  |     False     |   None  | {'encode': 'az64'} |\n",
       "|  tpep_pickup_datetime |    TIMESTAMP     |   True   |   None  |     False     |   None  | {'encode': 'az64'} |\n",
       "| tpep_dropoff_datetime |    TIMESTAMP     |   True   |   None  |     False     |   None  | {'encode': 'az64'} |\n",
       "|    passenger_count    | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "|     trip_distance     | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "|       ratecodeid      | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "|   store_and_fwd_flag  |    VARCHAR(1)    |   True   |   None  |     False     |   None  | {'encode': 'lzo'}  |\n",
       "|      pulocationid     |      BIGINT      |   True   |   None  |     False     |   None  | {'encode': 'az64'} |\n",
       "|      dolocationid     |      BIGINT      |   True   |   None  |     False     |   None  | {'encode': 'az64'} |\n",
       "|      payment_type     |      BIGINT      |   True   |   None  |     False     |   None  | {'encode': 'az64'} |\n",
       "|      fare_amount      | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "|         extra         | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "|        mta_tax        | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "|       tip_amount      | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "|      tolls_amount     | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "| improvement_surcharge | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "|      total_amount     | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "|  congestion_surcharge | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "|      airport_fee      | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |         {}         |\n",
       "+-----------------------+------------------+----------+---------+---------------+---------+--------------------+"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sqlcmd columns --table taxi"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5a9b8f5c-f5c4-4e95-ab54-09d0f3122790",
   "metadata": {},
   "source": [
    "## Profile a dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "b46f42ff-c973-48c2-a0c1-184cb8ca4c29",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style='position: sticky; left: 0; padding: 10px; font-size: 12px; color: #FFA500'><strong></strong> Following statistics are not available in\n",
       "            redshift_connector: STD, 25%, 50%, 75%</div><style>\n",
       " #profile-table td:first-child {\n",
       "  position: sticky;\n",
       "  left: 0;\n",
       "  background-color: var(--jp-cell-editor-background);\n",
       "  font-weight: bold;\n",
       "}\n",
       " #profile-table thead tr th:first-child {\n",
       "  position: sticky;\n",
       "  left: 0;\n",
       "  background-color: var(--jp-cell-editor-background);\n",
       "  font-weight: bold; /* Adding bold text */\n",
       "}\n",
       "            </style><style></style><table id=\"profile-table-a2a68ebf375d4157a310c94b45eb3bc8\">\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th> </th>\n",
       "            <th>vendorid</th>\n",
       "            <th>tpep_pickup_datetime</th>\n",
       "            <th>tpep_dropoff_datetime</th>\n",
       "            <th>passenger_count</th>\n",
       "            <th>trip_distance</th>\n",
       "            <th>ratecodeid</th>\n",
       "            <th>store_and_fwd_flag</th>\n",
       "            <th>pulocationid</th>\n",
       "            <th>dolocationid</th>\n",
       "            <th>payment_type</th>\n",
       "            <th>fare_amount</th>\n",
       "            <th>extra</th>\n",
       "            <th>mta_tax</th>\n",
       "            <th>tip_amount</th>\n",
       "            <th>tolls_amount</th>\n",
       "            <th>improvement_surcharge</th>\n",
       "            <th>total_amount</th>\n",
       "            <th>congestion_surcharge</th>\n",
       "            <th>airport_fee</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>count</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>2995023</td>\n",
       "            <td>3066766</td>\n",
       "            <td>2995023</td>\n",
       "            <td>2995023</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>3066766</td>\n",
       "            <td>2995023</td>\n",
       "            <td>2995023</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>unique</td>\n",
       "            <td>2</td>\n",
       "            <td>1610975</td>\n",
       "            <td>1611319</td>\n",
       "            <td>10</td>\n",
       "            <td>4387</td>\n",
       "            <td>7</td>\n",
       "            <td>2</td>\n",
       "            <td>257</td>\n",
       "            <td>261</td>\n",
       "            <td>5</td>\n",
       "            <td>6873</td>\n",
       "            <td>68</td>\n",
       "            <td>10</td>\n",
       "            <td>4036</td>\n",
       "            <td>776</td>\n",
       "            <td>5</td>\n",
       "            <td>15871</td>\n",
       "            <td>3</td>\n",
       "            <td>3</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>mean</td>\n",
       "            <td>1.0000</td>\n",
       "            <td>nan</td>\n",
       "            <td>nan</td>\n",
       "            <td>1.3625</td>\n",
       "            <td>3.8473</td>\n",
       "            <td>1.4974</td>\n",
       "            <td>nan</td>\n",
       "            <td>166.0000</td>\n",
       "            <td>164.0000</td>\n",
       "            <td>1.0000</td>\n",
       "            <td>18.3671</td>\n",
       "            <td>1.5378</td>\n",
       "            <td>0.4883</td>\n",
       "            <td>3.3679</td>\n",
       "            <td>0.5185</td>\n",
       "            <td>0.9821</td>\n",
       "            <td>27.0204</td>\n",
       "            <td>2.2742</td>\n",
       "            <td>0.1074</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>min</td>\n",
       "            <td>1</td>\n",
       "            <td>nan</td>\n",
       "            <td>nan</td>\n",
       "            <td>0.0</td>\n",
       "            <td>0.0</td>\n",
       "            <td>1.0</td>\n",
       "            <td>nan</td>\n",
       "            <td>1</td>\n",
       "            <td>1</td>\n",
       "            <td>0</td>\n",
       "            <td>-900.0</td>\n",
       "            <td>-7.5</td>\n",
       "            <td>-0.5</td>\n",
       "            <td>-96.22</td>\n",
       "            <td>-65.0</td>\n",
       "            <td>-1.0</td>\n",
       "            <td>-751.0</td>\n",
       "            <td>-2.5</td>\n",
       "            <td>-1.25</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>max</td>\n",
       "            <td>2</td>\n",
       "            <td>nan</td>\n",
       "            <td>nan</td>\n",
       "            <td>9.0</td>\n",
       "            <td>258928.15</td>\n",
       "            <td>99.0</td>\n",
       "            <td>nan</td>\n",
       "            <td>265</td>\n",
       "            <td>265</td>\n",
       "            <td>4</td>\n",
       "            <td>1160.1</td>\n",
       "            <td>12.5</td>\n",
       "            <td>53.16</td>\n",
       "            <td>380.8</td>\n",
       "            <td>196.99</td>\n",
       "            <td>1.0</td>\n",
       "            <td>1169.4</td>\n",
       "            <td>2.5</td>\n",
       "            <td>1.25</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table><div style='position: sticky; left: 0; padding: 10px; font-size: 12px; color: black; background-color: white;'><strong></strong> </div>"
      ],
      "text/plain": [
       "+--------+----------+----------------------+-----------------------+-----------------+---------------+------------+--------------------+--------------+--------------+--------------+-------------+---------+---------+------------+--------------+-----------------------+--------------+----------------------+-------------+\n",
       "|        | vendorid | tpep_pickup_datetime | tpep_dropoff_datetime | passenger_count | trip_distance | ratecodeid | store_and_fwd_flag | pulocationid | dolocationid | payment_type | fare_amount |  extra  | mta_tax | tip_amount | tolls_amount | improvement_surcharge | total_amount | congestion_surcharge | airport_fee |\n",
       "+--------+----------+----------------------+-----------------------+-----------------+---------------+------------+--------------------+--------------+--------------+--------------+-------------+---------+---------+------------+--------------+-----------------------+--------------+----------------------+-------------+\n",
       "| count  | 3066766  |       3066766        |        3066766        |     2995023     |    3066766    |  2995023   |      2995023       |   3066766    |   3066766    |   3066766    |   3066766   | 3066766 | 3066766 |  3066766   |   3066766    |        3066766        |   3066766    |       2995023        |   2995023   |\n",
       "| unique |    2     |       1610975        |        1611319        |        10       |      4387     |     7      |         2          |     257      |     261      |      5       |     6873    |    68   |    10   |    4036    |     776      |           5           |    15871     |          3           |      3      |\n",
       "|  mean  |  1.0000  |         nan          |          nan          |      1.3625     |     3.8473    |   1.4974   |        nan         |   166.0000   |   164.0000   |    1.0000    |   18.3671   |  1.5378 |  0.4883 |   3.3679   |    0.5185    |         0.9821        |   27.0204    |        2.2742        |    0.1074   |\n",
       "|  min   |    1     |         nan          |          nan          |       0.0       |      0.0      |    1.0     |        nan         |      1       |      1       |      0       |    -900.0   |   -7.5  |   -0.5  |   -96.22   |    -65.0     |          -1.0         |    -751.0    |         -2.5         |    -1.25    |\n",
       "|  max   |    2     |         nan          |          nan          |       9.0       |   258928.15   |    99.0    |        nan         |     265      |     265      |      4       |    1160.1   |   12.5  |  53.16  |   380.8    |    196.99    |          1.0          |    1169.4    |         2.5          |     1.25    |\n",
       "+--------+----------+----------------------+-----------------------+-----------------+---------------+------------+--------------------+--------------+--------------+--------------+-------------+---------+---------+------------+--------------+-----------------------+--------------+----------------------+-------------+"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sqlcmd profile --table taxi"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c82b2d3-5ebd-46f2-bc0b-2ad34737ebbf",
   "metadata": {},
   "source": [
    "## Plotting\n",
    "\n",
    "Let's create a histogram for the `trip_distance`. Since there are outliers, we'll use the 99th percentile as a cutoff value."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d747789f-a627-408c-a122-0443f2fdb90d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;redshift-sqlalchemy&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'redshift-sqlalchemy'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>percentile_disc</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>20.0</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>\n",
       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
      ],
      "text/plain": [
       "+-----------------+\n",
       "| percentile_disc |\n",
       "+-----------------+\n",
       "|       20.0      |\n",
       "+-----------------+"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "SELECT \n",
    "    APPROXIMATE PERCENTILE_DISC(0.99) WITHIN GROUP (ORDER BY trip_distance)\n",
    "FROM \n",
    "    taxi;"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e27903cb",
   "metadata": {},
   "source": [
    "Let's create a new snippet by filtering out the outliers using `--save`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3e55ecc0-ecaf-4d4d-8cf9-4bc7735f5495",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;redshift-sqlalchemy&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'redshift-sqlalchemy'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Skipping execution...</span>"
      ],
      "text/plain": [
       "Skipping execution..."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%sql --save taxi_no_outliers --no-execute\n",
    "select * from taxi  where trip_distance < 20"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed87d158-6dd2-44f8-a26c-65ad4eafb6fa",
   "metadata": {},
   "source": [
    "### Histogram"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "a7e0685d-4950-4c97-9f5d-ac3be039d1e0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Plotting using saved snippet : taxi_no_outliers</span>"
      ],
      "text/plain": [
       "Plotting using saved snippet : taxi_no_outliers"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': \"'trip_distance' from 'taxi_no_outliers'\"}, xlabel='trip_distance', ylabel='Count'>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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cpft1auX+vfvr2nTpqlp06a6++67tXDhwgpf1/Pzzz9r7NixCgkJka+vr4KCgqz9z83NLVHfokULl+dXXHGFJOn48eOSpO+++04eHh4lfpmca+/evZKkW2+9VUFBQS6PNWvWWBed26W08fz+++9LfX3bt29vzT/X+fsdEBAgSQoPDy8x3el0lvraVVVlxsjLy0tvvvmm9u3bpxMnTmjhwoW2fanBx8fHuvar2BVXXGGNvfTr6xYWFqZGjRq51JX1upaluK6sMTp27Fi5p+bttnfvXu3YsaPEe7b4837++7a0991jjz2mNm3aqE+fPmrevLmGDBliXWsF98Q1VUA5zj0yUNs5HA7961//0meffaYPP/xQq1ev1pAhQ/TSSy/ps88+k5+f3wWXf+CBB7Rp0yY9+eSTioqKkp+fn5xOp26//XY5nc4S9WUdwTOVuAi5eL3/+Mc/FBoaWmJ+/fr2/piyYzzL2m87Xo/yVHaMVq9eLenXo1p79+6t1H8SLuRir8mqLmWFxvMvoL9YTqdTnTp1sq5XO9/5Abu0911wcLAyMzO1evVqrVy5UitXrtTChQv10EMPadGiRbb2i0uDUIU6z87bEXz77bcyxris85tvvpGkCl9I27JlSzmdTn333Xcu/zPfs2dPhfu47rrrdN111+kPf/iD3n77bT344IN69913NWzYsDL39/jx40pLS9O0adNcLqwuPpJUFa1atZLT6dTOnTsVFRVVZo306y+YuLi4Km/rYrRs2bLU13f37t3W/EvJrjH6+uuvNX36dD388MPKzMzUsGHDtG3bNuvIWnVr2bKl1q5dqxMnTrgcrars61pcV9YYNW3aVA0bNpT069GynJycEnWlHRW7mM9+q1at9NVXX+m22267qPV4eXmpb9++6tu3r5xOpx577DG9/vrreu6559S6desqrxc1g9N/qPMaNmxY6g/hqjh06JCWLl1qPc/Ly9Pf//53RUVFlXoUpjR9+vSRJL3yyisu02fPnl3ussePHy9xVKQ4zBSfAmzQoIEkldjn4iMP5y9fke2WpV+/fvLw8ND06dNLHEUp3k58fLz8/f31xz/+sdTrwI4ePVrl7VfUHXfcoc8//1zp6enWtPz8fL3xxhuKiIi44OnL6mDHGJ05c0ZJSUkKCwvTnDlzlJKSouzsbI0fP75aei7NHXfcoaKiIs2dO9dl+qxZs+RwOKz3enmaNWumqKgoLVq0yOU12b59u9asWaM77rjDmtaqVSvl5ubq66+/tqYdPnzY5XNZ7GI++w888IB+/PFH/eUvfykx79SpUxU6HXn+rUo8PDysb3lW9lYcqB04UoU6Lzo6WvPnz9fzzz+v1q1bKzg42LrYtLLatGmjoUOHasuWLQoJCdGbb76p7OxsLVy4sMLriIqK0qBBg/Taa68pNzdXPXv2VFpamr799ttyl120aJFee+013XPPPWrVqpVOnDihv/zlL/L397d+8fj6+qpDhw5677331KZNGzVu3FgdO3ZUx44dddNNN+nFF1/UmTNndOWVV2rNmjXat29flV4L6ddrzJ555hn9/ve/14033qh7771X3t7e2rJli8LCwjRjxgz5+/tr/vz5Gjx4sLp27aqBAwcqKChIBw4c0IoVK3T99deX+KVst0mTJumdd95Rnz59NGbMGDVu3FiLFi3Svn379O9//7vERfbVzY4xev7555WZmam0tDQ1atRInTt31uTJk/Xss8/qvvvucwki1aVv37665ZZb9Mwzz2j//v3q0qWL1qxZow8++EDjxo2r1C0MZs6cqT59+ig2NlZDhw61bqkQEBDg8vcwBw4cqIkTJ+qee+7RmDFjrNtztGnTpsSF/NHR0Vq7dq1efvllhYWFKTIyUjExMRXqZ/DgwVq8eLFGjBih9evX6/rrr1dRUZF2796txYsXW/dCu5Bhw4bp559/1q233qrmzZvr+++/16uvvqqoqCjrujO4mRr73iFQS2RlZZmEhATTqFEjI8n62nTx16pLuz1BWbdUSEhIMKtXrzadO3c23t7epl27dmbJkiWV7unUqVNmzJgxpkmTJqZhw4amb9++5uDBg+XeUmHr1q1m0KBBpkWLFsbb29sEBwebO++803zxxRcu69+0aZOJjo42Xl5eLuv84YcfzD333GMCAwNNQECAuf/++82hQ4dKbLesWxaU9roYY8ybb75prr32WuPt7W2uuOIK06tXL5OamupSs379ehMfH28CAgKMj4+PadWqlUlKSirRe0Vc6JYKCQkJpS7z3Xffmfvuu88EBgYaHx8f06NHD7N8+fISPUoqMaZlvVfK6qMiLmaMMjIyTP369c3o0aNd1nn27FnTvXt3ExYWZo4fP+7SY2UkJiaahg0blphe2rpOnDhhxo8fb8LCwoynp6e5+uqrzcyZM61balTG2rVrzfXXX298fX2Nv7+/6du3r9m5c2eJujVr1piOHTsaLy8v07ZtW/PWW2+V2tvu3bvNTTfdZHx9fY0k6/YKFbmlgjHGFBYWmj/96U/mmmuusd7b0dHRZtq0aSY3N9eqk2SSk5NL9Pmvf/3L9O7d2wQHBxsvLy/TokUL8+ijj5rDhw9X+rVB7eAwxsYrKIE6LCIiQh07dtTy5ctruhUAQA3gmioAAAAbcE0VcAmVdwNQX1/fS/bNLOB8ubm55f6B6Yp+4aI2bxOoLoQq4BJq1qzZBecnJiYqJSXl0jQDnGfs2LHl3h/J7itGamKbQHXhmirgElq7du0F54eFhV3yr+8DxXbu3KlDhw5dsMbue4nVxDaB6kKoAgAAsAEXqgMAANiAa6ouIafTqUOHDqlRo0a2/mkUAABQfYwxOnHihMLCwi54M2BC1SV06NChEn9kEwAAuIeDBw+qefPmZc4nVF1CxX9Q9ODBg/L396/hbgAAQEXk5eUpPDzc5Q+Dl4ZQdQkVn/Lz9/cnVAEA4GbKu3SHC9UBAABsQKgCAACwAaEKAADABoQqAAAAGxCqAAAAbECoAgAAsAGhCgAAwAaEKgAAABsQqgAAAGxAqAIAALABoQoAAMAGhCoAAAAbEKoAAABsQKgCAACwAaEKAADABvVrugG4p4hJK8qt2f9CwiXoBACA2oEjVQAAADYgVAEAANiAUAUAAGADQhUAAIANCFUAAAA2IFQBAADYgFAFAABgA+5TBRcVuf8UAAAoiSNVAAAANiBUAQAA2IBQBQAAYANCFQAAgA0IVQAAADYgVAEAANiAUAUAAGADQhUAAIANCFUAAAA2IFQBAADYgFAFAABgA0IVAACADQhVAAAANiBUAQAA2IBQBQAAYANCFQAAgA0IVQAAADYgVAEAANiAUAUAAGADQhUAAIANCFUAAAA2IFQBAADYgFAFAABgA0IVAACADQhVAAAANiBUAQAA2IBQBQAAYANCFQAAgA0IVQAAADYgVAEAANiAUAUAAGADQhUAAIANCFUAAAA2IFQBAADYgFAFAABgA0IVAACADQhVAAAANiBUAQAA2IBQBQAAYANCFQAAgA0IVQAAADaoNaHqhRdekMPh0Lhx46xpp0+fVnJyspo0aSI/Pz/1799f2dnZLssdOHBACQkJatCggYKDg/Xkk0/q7NmzLjUbNmxQ165d5e3trdatWyslJaXE9ufNm6eIiAj5+PgoJiZGn3/+ucv8ivQCAADqrloRqrZs2aLXX39dnTt3dpk+fvx4ffjhh1qyZIk2btyoQ4cO6d5777XmFxUVKSEhQYWFhdq0aZMWLVqklJQUTZ482arZt2+fEhISdMsttygzM1Pjxo3TsGHDtHr1aqvmvffe04QJEzRlyhRt3bpVXbp0UXx8vI4cOVLhXgAAQN3mMMaYmmzgl19+UdeuXfXaa6/p+eefV1RUlGbPnq3c3FwFBQXp7bff1n333SdJ2r17t9q3b6/09HRdd911Wrlype68804dOnRIISEhkqQFCxZo4sSJOnr0qLy8vDRx4kStWLFC27dvt7Y5cOBA5eTkaNWqVZKkmJgYde/eXXPnzpUkOZ1OhYeHa/To0Zo0aVKFeqmIvLw8BQQEKDc3V/7+/ra9hnaKmLTCtnXtfyHBtnUBAFBTKvr7u8aPVCUnJyshIUFxcXEu0zMyMnTmzBmX6e3atVOLFi2Unp4uSUpPT1enTp2sQCVJ8fHxysvL044dO6ya89cdHx9vraOwsFAZGRkuNR4eHoqLi7NqKtILAACo2+rX5Mbfffddbd26VVu2bCkxLysrS15eXgoMDHSZHhISoqysLKvm3EBVPL943oVq8vLydOrUKR0/flxFRUWl1uzevbvCvZSmoKBABQUF1vO8vLwyawEAgHursSNVBw8e1NixY/XPf/5TPj4+NdVGtZoxY4YCAgKsR3h4eE23BAAAqkmNhaqMjAwdOXJEXbt2Vf369VW/fn1t3LhRr7zyiurXr6+QkBAVFhYqJyfHZbns7GyFhoZKkkJDQ0t8A6/4eXk1/v7+8vX1VdOmTVWvXr1Sa85dR3m9lObpp59Wbm6u9Th48GDFXhwAAOB2aixU3Xbbbdq2bZsyMzOtR7du3fTggw9a//b09FRaWpq1zJ49e3TgwAHFxsZKkmJjY7Vt2zaXb+mlpqbK399fHTp0sGrOXUdxTfE6vLy8FB0d7VLjdDqVlpZm1URHR5fbS2m8vb3l7+/v8gAAAJenGrumqlGjRurYsaPLtIYNG6pJkybW9KFDh2rChAlq3Lix/P39NXr0aMXGxlrftuvdu7c6dOigwYMH68UXX1RWVpaeffZZJScny9vbW5I0YsQIzZ07V0899ZSGDBmidevWafHixVqx4v++5TZhwgQlJiaqW7du6tGjh2bPnq38/Hw9/PDDkqSAgIByewEAAHVbjV6oXp5Zs2bJw8ND/fv3V0FBgeLj4/Xaa69Z8+vVq6fly5dr5MiRio2NVcOGDZWYmKjp06dbNZGRkVqxYoXGjx+vOXPmqHnz5vrrX/+q+Ph4q2bAgAE6evSoJk+erKysLEVFRWnVqlUuF6+X1wsAAKjbavw+VXUJ96kCAMD9uM19qgAAAC4HhCoAAAAbEKoAAABsQKgCAACwAaEKAADABoQqAAAAG9Tq+1TBvVXk9gzcdgEAcLngSBUAAIANCFUAAAA2IFQBAADYgFAFAABgA0IVAACADQhVAAAANiBUAQAA2IBQBQAAYANCFQAAgA0IVQAAADYgVAEAANiAUAUAAGADQhUAAIANCFUAAAA2IFQBAADYgFAFAABgA0IVAACADQhVAAAANiBUAQAA2IBQBQAAYANCFQAAgA0IVQAAADYgVAEAANiAUAUAAGADQhUAAIANCFUAAAA2IFQBAADYgFAFAABgA0IVAACADQhVAAAANiBUAQAA2IBQBQAAYANCFQAAgA0IVQAAADYgVAEAANiAUAUAAGADQhUAAIANCFUAAAA2IFQBAADYgFAFAABgA0IVAACADQhVAAAANiBUAQAA2IBQBQAAYANCFQAAgA0IVQAAADYgVAEAANiAUAUAAGADQhUAAIANCFUAAAA2IFQBAADYgFAFAABgA0IVAACADQhVAAAANiBUAQAA2IBQBQAAYANCFQAAgA1qNFTNnz9fnTt3lr+/v/z9/RUbG6uVK1da80+fPq3k5GQ1adJEfn5+6t+/v7Kzs13WceDAASUkJKhBgwYKDg7Wk08+qbNnz7rUbNiwQV27dpW3t7dat26tlJSUEr3MmzdPERER8vHxUUxMjD7//HOX+RXpBQAA1F01GqqaN2+uF154QRkZGfriiy9066236u6779aOHTskSePHj9eHH36oJUuWaOPGjTp06JDuvfdea/mioiIlJCSosLBQmzZt0qJFi5SSkqLJkydbNfv27VNCQoJuueUWZWZmaty4cRo2bJhWr15t1bz33nuaMGGCpkyZoq1bt6pLly6Kj4/XkSNHrJryegEAAHWbwxhjarqJczVu3FgzZ87Ufffdp6CgIL399tu67777JEm7d+9W+/btlZ6eruuuu04rV67UnXfeqUOHDikkJESStGDBAk2cOFFHjx6Vl5eXJk6cqBUrVmj79u3WNgYOHKicnBytWrVKkhQTE6Pu3btr7ty5kiSn06nw8HCNHj1akyZNUm5ubrm9VEReXp4CAgKUm5srf39/214zO0VMWnFJt7f/hYRLuj0AACqror+/a801VUVFRXr33XeVn5+v2NhYZWRk6MyZM4qLi7Nq2rVrpxYtWig9PV2SlJ6erk6dOlmBSpLi4+OVl5dnHe1KT093WUdxTfE6CgsLlZGR4VLj4eGhuLg4q6YivZSmoKBAeXl5Lg8AAHB5qvFQtW3bNvn5+cnb21sjRozQ0qVL1aFDB2VlZcnLy0uBgYEu9SEhIcrKypIkZWVluQSq4vnF8y5Uk5eXp1OnTunYsWMqKioqtebcdZTXS2lmzJihgIAA6xEeHl6xFwUAALidGg9Vbdu2VWZmpjZv3qyRI0cqMTFRO3furOm2bPH0008rNzfXehw8eLCmWwIAANWkfk034OXlpdatW0uSoqOjtWXLFs2ZM0cDBgxQYWGhcnJyXI4QZWdnKzQ0VJIUGhpa4lt6xd/IO7fm/G/pZWdny9/fX76+vqpXr57q1atXas256yivl9J4e3vL29u7Eq8GAABwVzV+pOp8TqdTBQUFio6Olqenp9LS0qx5e/bs0YEDBxQbGytJio2N1bZt21y+pZeamip/f3916NDBqjl3HcU1xevw8vJSdHS0S43T6VRaWppVU5FeAABA3VajR6qefvpp9enTRy1atNCJEyf09ttva8OGDVq9erUCAgI0dOhQTZgwQY0bN5a/v79Gjx6t2NhY69t2vXv3VocOHTR48GC9+OKLysrK0rPPPqvk5GTrCNGIESM0d+5cPfXUUxoyZIjWrVunxYsXa8WK//uW24QJE5SYmKhu3bqpR48emj17tvLz8/Xwww9LUoV6AQAAdVuNhqojR47ooYce0uHDhxUQEKDOnTtr9erV+s1vfiNJmjVrljw8PNS/f38VFBQoPj5er732mrV8vXr1tHz5co0cOVKxsbFq2LChEhMTNX36dKsmMjJSK1as0Pjx4zVnzhw1b95cf/3rXxUfH2/VDBgwQEePHtXkyZOVlZWlqKgorVq1yuXi9fJ6AQAAdVutu0/V5Yz7VJXEfaoAALWd292nCgAAwJ0RqgAAAGxAqAIAALBBjd+nCnVbRa7h4rorAIA74EgVAACADQhVAAAANiBUAQAA2IBQBQAAYANCFQAAgA0IVQAAADYgVAEAANiAUAUAAGADQhUAAIANqhSqrrrqKv30008lpufk5Oiqq6666KYAAADcTZVC1f79+1VUVFRiekFBgX788ceLbgoAAMDdVOpv//3nP/+x/r169WoFBARYz4uKipSWlqaIiAjbmgMAAHAXlQpV/fr1kyQ5HA4lJia6zPP09FRERIReeukl25oDAABwF5UKVU6nU5IUGRmpLVu2qGnTptXSFAAAgLupVKgqtm/fPrv7AAAAcGtVClWSlJaWprS0NB05csQ6glXszTffvOjGAAAA3EmVQtW0adM0ffp0devWTc2aNZPD4bC7LwAAALdSpVC1YMECpaSkaPDgwXb3AwAA4JaqdJ+qwsJC9ezZ0+5eAAAA3FaVQtWwYcP09ttv290LAACA26rS6b/Tp0/rjTfe0Nq1a9W5c2d5enq6zH/55ZdtaQ4AAMBdVClUff3114qKipIkbd++3WUeF60DAIC6qEqhav369Xb3AQAA4NaqdE0VAAAAXFXpSNUtt9xywdN869atq3JDAAAA7qhKoar4eqpiZ86cUWZmprZv317iDy0DAADUBVUKVbNmzSp1+tSpU/XLL79cVEMAAADuyNZrqn73u9/xd/8AAECdZGuoSk9Pl4+Pj52rBAAAcAtVOv137733ujw3xujw4cP64osv9Nxzz9nSGAAAgDupUqgKCAhwee7h4aG2bdtq+vTp6t27ty2NAQAAuJMqhaqFCxfa3QcAAIBbq1KoKpaRkaFdu3ZJkq655hpde+21tjQFAADgbqoUqo4cOaKBAwdqw4YNCgwMlCTl5OTolltu0bvvvqugoCA7ewQAAKj1qvTtv9GjR+vEiRPasWOHfv75Z/3888/avn278vLyNGbMGLt7BAAAqPWqdKRq1apVWrt2rdq3b29N69Chg+bNm8eF6gAAoE6q0pEqp9MpT0/PEtM9PT3ldDovuikAAAB3U6VQdeutt2rs2LE6dOiQNe3HH3/U+PHjddttt9nWHAAAgLuoUqiaO3eu8vLyFBERoVatWqlVq1aKjIxUXl6eXn31Vbt7BAAAqPWqdE1VeHi4tm7dqrVr12r37t2SpPbt2ysuLs7W5gAAANxFpY5UrVu3Th06dFBeXp4cDod+85vfaPTo0Ro9erS6d++ua665Rv/973+rq1cAAIBaq1Khavbs2XrkkUfk7+9fYl5AQIAeffRRvfzyy7Y1BwAA4C4qFaq++uor3X777WXO7927tzIyMi66KQAAAHdTqVCVnZ1d6q0UitWvX19Hjx696KYAAADcTaVC1ZVXXqnt27eXOf/rr79Ws2bNLropAAAAd1OpUHXHHXfoueee0+nTp0vMO3XqlKZMmaI777zTtuYAAADcRaVuqfDss8/q/fffV5s2bTRq1Ci1bdtWkrR7927NmzdPRUVFeuaZZ6qlUQAAgNqsUqEqJCREmzZt0siRI/X000/LGCNJcjgcio+P17x58xQSElItjQIAANRmlb75Z8uWLfXRRx/p+PHj+vbbb2WM0dVXX60rrriiOvoDAABwC1W6o7okXXHFFerevbudvQAAALitKv3tPwAAALgiVAEAANiAUAUAAGADQhUAAIANCFUAAAA2IFQBAADYgFAFAABgA0IVAACADap880/gUomYtKLcmv0vJFyCTgAAKFuNHqmaMWOGunfvrkaNGik4OFj9+vXTnj17XGpOnz6t5ORkNWnSRH5+furfv7+ys7Ndag4cOKCEhAQ1aNBAwcHBevLJJ3X27FmXmg0bNqhr167y9vZW69atlZKSUqKfefPmKSIiQj4+PoqJidHnn39e6V4AAEDdVKOhauPGjUpOTtZnn32m1NRUnTlzRr1791Z+fr5VM378eH344YdasmSJNm7cqEOHDunee++15hcVFSkhIUGFhYXatGmTFi1apJSUFE2ePNmq2bdvnxISEnTLLbcoMzNT48aN07Bhw7R69Wqr5r333tOECRM0ZcoUbd26VV26dFF8fLyOHDlS4V4AAEDd5TDGmJpuotjRo0cVHBysjRs36qabblJubq6CgoL09ttv67777pMk7d69W+3bt1d6erquu+46rVy5UnfeeacOHTqkkJAQSdKCBQs0ceJEHT16VF5eXpo4caJWrFih7du3W9saOHCgcnJytGrVKklSTEyMunfvrrlz50qSnE6nwsPDNXr0aE2aNKlCvZQnLy9PAQEBys3Nlb+/v62vnV0qcqqtNuL0HwCgulT093etulA9NzdXktS4cWNJUkZGhs6cOaO4uDirpl27dmrRooXS09MlSenp6erUqZMVqCQpPj5eeXl52rFjh1Vz7jqKa4rXUVhYqIyM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4s4vbOPGjUpOTtZnn32m1NRUnTlzRr1791Z+fv4Fl/P399fhw4etx/fff3+JOq68a665xqXXTz75pMxadxk3SdqyZYvLfqWmpkqS7r///jKXqa3jlp+fry5dumjevHmlzn/xxRf1yiuvaMGCBdq8ebMaNmyo+Ph4nT59usx1VvYzW10utG8nT57U1q1b9dxzz2nr1q16//33tWfPHt11113lrrcy7+vqVN7YSdLtt9/u0us777xzwXW6w9hJctmnw4cP680335TD4VD//v0vuN7aMHYV+dk/fvx4ffjhh1qyZIk2btyoQ4cO6d57773geqvyWb0oBm6pR48eJjk52XpeVFRkwsLCzIwZM0qtf+CBB0xCQoLLtJiYGPPoo49Wa58X68iRI0aS2bhxY5k1CxcuNAEBAZeuqYswZcoU06VLlwrXu+u4GWPM2LFjTatWrYzT6Sx1vruMmySzdOlS67nT6TShoaFm5syZ1rScnBzj7e1t3nnnnTLXU9nP7KVw/r6V5vPPPzeSzPfff19mTWXf15dKafuXmJho7r777kqtx13H7u677za33nrrBWtq69id/7M/JyfHeHp6miVLllg1u3btMpJMenp6qeuo6mf1YnCkyg0VFhYqIyNDcXFx1jQPDw/FxcUpPT291GXS09Nd6iUpPj6+zPraIjc3V5LUuHHjC9b98ssvatmypcLDw3X33Xdrx44dl6K9Ktm7d6/CwsJ01VVX6cEHH9SBAwfKrHXXcSssLNRbb72lIUOGXPCPh7vTuBXbt2+fsrKyXMYlICBAMTExZY5LVT6ztUVubq4cDke5f7e0Mu/rmrZhwwYFBwerbdu2GjlypH766acya9117LKzs7VixQoNHTq03NraOHbn/+zPyMjQmTNnXMahXbt2atGiRZnjUJXP6sUiVLmhY8eOqaioqMSfxwkJCVFWVlapy2RlZVWqvjZwOp0aN26crr/+enXs2LHMurZt2+rNN9/UBx98oLfeektOp1M9e/bUDz/8cAm7rZiYmBilpKRo1apVmj9/vvbt26cbb7xRJ06cKLXeHcdNkpYtW6acnBwlJSWVWeNO43au4te+MuNSlc9sbXD69GlNnDhRgwYNuuAfrK3s+7om3X777fr73/+utLQ0/elPf9LGjRvVp08fFRUVlVrvrmO3aNEiNWrUqNzTY7Vx7Er72Z+VlSUv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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%sqlplot histogram --table taxi_no_outliers --column trip_distance"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8b721b7c-3677-4c39-8f6a-7fa604d8b718",
   "metadata": {},
   "source": [
    "### Boxplot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "d31e6f94-fe6f-4b09-b808-21e28224cbc7",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Plotting using saved snippet : taxi_no_outliers</span>"
      ],
      "text/plain": [
       "Plotting using saved snippet : taxi_no_outliers"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': \"'trip_distance' from 'taxi_no_outliers'\"}, ylabel='trip_distance'>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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MECtWrVSZGSkVqxYofPnz2vRokVFbuPu7i4fHx+bBwAAuH2Vag7Q0qVLtXDhQrVr104Wi8Xa3rx5cx05csRuxUn/Cz/Hjh3T2rVrSxxO/Pz81LhxYx0+fNiudQEAgIqrVGeATp8+rZo1axZoz87OtglEtyo//CQnJ2vNmjW64447SjzGhQsXdOTIEQUGBtqtLgAAULGVKgDdfffd+uabb6zL+aHnb3/7myIiIoo9zoULF5SUlKSkpCRJUkpKipKSkpSamqqrV6/q4Ycf1vbt2/XPf/5Tubm5SktLU1pamq5cuWIdo1u3bpo1a5Z1efz48dqwYYOOHj2qzZs3q1+/fnJ1dVV0dHRpDhUAANyGSnUJ7I033lBUVJT27duna9euaebMmdq3b582b96sDRs2FHuc7du367777rMujxs3TpI0aNAgxcbG6t///rckKSwszGa7devWqWvXrpKkI0eO6MyZM9Z1J06cUHR0tM6ePSt/f3917NhRW7dulb+/f2kOFQAA3IYshmEYpdnwyJEjevPNN7Vr1y5duHBBbdq0sd65uaLLzMyUr6+vMjIymBANVHAluSxfyl+HAJxESd6/Sx2AbmcEIOD2QQACzKMk79+lmgO0YsUKrVq1qkD7qlWr9O2335ZmSAAAgHJTqgA0YcIE5ebmFmg3DEMTJky45aIAAADKUqkCUHJyspo1a1agPTQ0lPvtAAAAp1eqAOTr66uff/65QPvhw4dVtWrVWy4KAACgLJUqAPXp00djx461uevz4cOH9cILL6h37952Kw4AAKAslCoAvf3226patapCQ0NVr1491atXT02bNtUdd9yhv/71r/auEQAAwK5KdSNEX19fbd68WQkJCdq1a5c8PT3VqlUrde7c2d71AQAA2B33ASoE9wECbh/cBwgwj5K8f5fqDJAkJSYmKjExUb/++qvy8vJs1s2dO7e0wwIAAJS5UgWgKVOmaOrUqbr77rsVGBho12+ABwAAKGulCkBz5sxRfHy8nnzySXvXAwAAUOZK9SmwK1euqH379vauBQAAoFyUKgANGzZMn332mb1rAQAAKBelugR2+fJlffzxx1qzZo1atWqlypUr26x/99137VIcAABAWShVAPrpp58UFhYmSdqzZ4/NOiZEAwAAZ1eqALRu3Tp71wEAAFBuSjUHCAAAoCIr9Y0Qt2/frkWLFik1NVVXrlyxWbd48eJbLgwAAKCslOoM0BdffKH27dtr//79WrJkia5evaq9e/dq7dq18vX1tXeNAAAAdlWqAPTGG29o+vTp+vrrr+Xm5qaZM2fqwIEDeuSRR1SnTh171wgAAGBXpQpAR44cUc+ePSVJbm5uys7OlsVi0fPPP6+PP/7YrgUCAADYW6kCULVq1ZSVlSVJuvPOO60fhT9//rwuXrxov+oAAADKQKkmQXfu3FkJCQlq2bKlBgwYoDFjxmjt2rVKSEhQt27d7F0jAACAXZUqAM2aNUuXL1+WJL3yyiuqXLmyNm/erP79++vVV1+1a4EAAAD2ZjEMw3B0Ec4mMzNTvr6+ysjIkI+Pj6PLAXALSnJ3en4dAhVbSd6/SzUHyNXVVb/++muB9rNnz8rV1bU0QwIAAJSbUgWgov5KysnJkZub2y0VBAAAUNZKNAfovffek3T9lPLf/vY3eXl5Wdfl5uZq48aNCg0NtW+FAAAAdlaiADR9+nRJ188AzZkzx+Zyl5ubm0JCQjRnzhz7VggAAGBnJQpAKSkpkqT77rtPixcvVrVq1cqkKAAAgLJUqjlA69atswk/ubm5SkpK0rlz50o0zsaNG9WrVy8FBQXJYrFo6dKlNusNw9CkSZMUGBgoT09Pde/eXcnJyTcd94MPPlBISIg8PDzUtm1bff/99yWqCwAA3N5KFYDGjh2rv//975Kuh5/OnTurTZs2Cg4O1vr164s9TnZ2tlq3bq0PPvig0PVvv/223nvvPc2ZM0fbtm1T1apVFRkZab0HUWEWLlyocePGafLkydq5c6dat26tyMjIQj+1BgAAzKlU9wG68847tWzZMt19991aunSpRo4cqXXr1unTTz/V2rVr9d1335W8EItFS5YsUd++fSVdP/sTFBSkF154QePHj5ckZWRkqFatWoqPj9djjz1W6Dht27bVPffco1mzZkmS8vLyFBwcrOeee04TJkwodJucnBzl5ORYlzMzMxUcHMx9gIDbAPcBAsyjzO8DdPbsWQUEBEiSVqxYoQEDBqhx48YaMmSIdu/eXZohC0hJSVFaWpq6d+9ubfP19VXbtm21ZcuWQre5cuWKduzYYbONi4uLunfvXuQ2khQXFydfX1/rIzg42C7HAAAAnFOpAlCtWrW0b98+5ebmauXKlbr//vslSRcvXrTbjRDT0tKs+/r9vvPX/d6ZM2eUm5tbom0kaeLEicrIyLA+jh8/fovVAwAAZ1aq7wIbPHiwHnnkEQUGBspisVjPuGzbtq1C3gfI3d1d7u7uji4DAACUk1IFoNjYWLVo0ULHjx/XgAEDrOHB1dW1yHk2JZV/iS09PV2BgYHW9vT0dIWFhRW6TY0aNeTq6qr09HSb9vT0dOt4AAAApboEJkkPP/ywnn/+edWuXdvaNmjQIPXp08cuhdWrV08BAQFKTEy0tmVmZmrbtm2KiIgodBs3NzeFh4fbbJOXl6fExMQitwEAAOZT7DNA7733nkaMGCEPDw/rV2IUZfTo0cUa88KFCzp8+LB1OSUlRUlJSapevbrq1KmjsWPH6vXXX1ejRo1Ur149/fnPf1ZQUJD1k2KS1K1bN/Xr10+jRo2SJI0bN06DBg3S3XffrXvvvVczZsxQdna2Bg8eXNxDBQAAt7liB6Dp06fr8ccfl4eHh/UrMQpjsViKHYC2b9+u++67z7o8btw4SdfPJMXHx+ull15Sdna2RowYofPnz6tjx45auXKlPDw8rNscOXJEZ86csS4/+uijOn36tCZNmqS0tDSFhYVp5cqVBSZGAwAA8yrVfYBudyW5jwAA58Z9gADzKPP7AAEAAFRkxb4Eln95qjjefffdUhUDAABQHoodgH788Ueb5Z07d+ratWtq0qSJJOnQoUNydXVVeHi4fSsEAACws2IHoHXr1ln//91335W3t7fmz59v/Vb4c+fOafDgwerUqZP9qwQAALCjUn8Z6urVq9W8eXOb9j179qhHjx46efKk3Qp0BCZBA7cPJkED5lHmk6AzMzN1+vTpAu2nT59WVlZWaYYEAAAoN6UKQP369dPgwYO1ePFinThxQidOnNBXX32loUOH6qGHHrJ3jQAAAHZVqu8CmzNnjsaPH68//elPunr16vWBKlXS0KFDNW3aNLsWCAAAYG+3dCPE7OxsHTlyRJLUoEEDVa1a1Wb9iRMnFBQUJBeXinW7IeYAAbcP5gAB5lGS9+9SnQHKV7VqVbVq1arI9c2aNVNSUpLq169/K7sBAACwqzI9NcNfUwAAwBlVrGtTAAAAdkAAAgAApkMAAgAAplOmAagkn74AAAAoL0yCBgAApnNLH4OXpOPHj0uSgoODC6zbt2+fgoKCbnUXAAAAdlWqM0DXrl3Tn//8Z/n6+iokJEQhISHy9fXVq6++ar0ztHQ9FLm6utqtWAAAAHso1Rmg5557TosXL9bbb7+tiIgISdKWLVsUGxurs2fPavbs2XYtEgAAwJ5K9VUYvr6++uKLLxQVFWXTvmLFCkVHRysjI8NuBToCX4UB3D74KgzAPEry/l2qS2Du7u4KCQkp0F6vXj25ubmVZkgAAIByU6oANGrUKL322mvKycmxtuXk5Ogvf/mLRo0aZbfiAAAAykKp5gD9+OOPSkxMVO3atdW6dWtJ0q5du3TlyhV169ZNDz30kLXv4sWL7VMpAACAnZQqAPn5+al///42bYV9DB4AAMAZlSoAzZs3z951AAAAlBu+CwwAAJhOsc8AtWnTRomJiapWrZruuuuuG360dOfOnXYpDgAAoCwUOwD16dNH7u7ukqS+ffuWVT0AAABlrsQ3QszNzdV3332nVq1ayc/Pr4zKcixuhAjcPrgRImAeZXojRFdXV/Xo0UPnzp0rdYEAAACOVKpJ0C1atNDPP/9s71oAAADKRakC0Ouvv67x48dr+fLlOnXqlDIzM20e9hQSEiKLxVLgMXLkyEL7x8fHF+jr4eFh15oAAEDFVqr7AD344IOSpN69e9tcXzcMQxaLRbm5ufapTtIPP/xgM96ePXt0//33a8CAAUVu4+Pjo4MHD1qXSzIHAAAA3P5KfSPE4OBgubq62rTn5eUpNTXVLoXl8/f3t1l+88031aBBA3Xp0qXIbSwWiwICAoq9j5ycHJvvNbP3WSwAAOBcShWAhgwZolOnTqlmzZo27WfPnlX37t01aNAguxT3e1euXNGCBQs0bty4G57VuXDhgurWrau8vDy1adNGb7zxhpo3b15k/7i4OE2ZMqUsSgYAAE6oVHOA8i91/d6FCxfKdL7N0qVLdf78ecXExBTZp0mTJpo7d66WLVumBQsWKC8vT+3bt9eJEyeK3GbixInKyMiwPo4fP14G1QMAAGdRovsAjRs3TpI0c+ZMDR8+XFWqVLGuy83N1bZt2+Tq6qrvvvvO/pVKioyMlJubm77++utib3P16lU1bdpU0dHReu2114q1DfcBAm4f3AcIMI+SvH+X6BLYjz/+KOn6L4ndu3fLzc3Nus7NzU2tW7fW+PHjS1HyzR07dkxr1qzR4sWLS7Rd5cqVddddd+nw4cNlUhcAAKh4ShSA1q1bJ0kaPHiwZs6cWa5nR+bNm6eaNWuqZ8+eJdouNzdXu3fvtn5yDQAAoNSfAitPeXl5mjdvngYNGqRKlWxLHjhwoO68807FxcVJkqZOnap27dqpYcOGOn/+vKZNm6Zjx45p2LBh5VozAABwXqUKQOVtzZo1Sk1N1ZAhQwqsS01NlYvL/+Zynzt3TsOHD1daWpqqVaum8PBwbd68Wc2aNSvPkgEAgBMr8ZehmgGToIHbB5OgAfMo0y9DBQAAqOgIQAAAwHQIQAAAwHQIQAAAwHQIQAAAwHQIQAAAwHQIQAAAwHQIQAAAwHQqxJ2gAeDixYs6cOBAme5j586dpdouNDRUVapUsXM1AMoSAQhAhXDgwAGFh4eX6T5KO/6OHTvUpk0bO1cDoCwRgABUCKGhodqxY0eJtytJqCnN+NL12gBULAQgABVClSpVyvwsC2dxAPNgEjSA21pxv+CUL0IFzIUABOC2d7NwQ/gBzIcABMAUigo5hB/AnAhAAEzDMAzrROcdO3YQfgATIwABAADTIQABAADTIQABAADTIQABAADTIQABAADTIQABAADTIQABAADTIQABAADTIQABAADTIQABAADTIQABAADTIQABAADTIQABAADTIQABAADTIQABAADTcfoAFBsbK4vFYvMIDQ294TZffvmlQkND5eHhoZYtW2rFihXlVC0AAKgInD4ASVLz5s116tQp62PTpk1F9t28ebOio6M1dOhQ/fjjj+rbt6/69u2rPXv2lGPFAADAmVVydAHFUalSJQUEBBSr78yZM/XAAw/oxRdflCS99tprSkhI0KxZszRnzpxCt8nJyVFOTo51OTMz89aLBgAATqtCnAFKTk5WUFCQ6tevr8cff1ypqalF9t2yZYu6d+9u0xYZGaktW7YUuU1cXJx8fX2tj+DgYLvVDgAAnI/TB6C2bdsqPj5eK1eu1OzZs5WSkqJOnTopKyur0P5paWmqVauWTVutWrWUlpZW5D4mTpyojIwM6+P48eN2PQYAAOBcnP4SWFRUlPX/W7VqpbZt26pu3bpatGiRhg4dapd9uLu7y93d3S5jAQAA5+f0Z4B+z8/PT40bN9bhw4cLXR8QEKD09HSbtvT09GLPIQIAALe/CheALly4oCNHjigwMLDQ9REREUpMTLRpS0hIUERERHmUBwAAKgCnD0Djx4/Xhg0bdPToUW3evFn9+vWTq6uroqOjJUkDBw7UxIkTrf3HjBmjlStX6p133tGBAwcUGxur7du3a9SoUY46BAAA4GScfg7QiRMnFB0drbNnz8rf318dO3bU1q1b5e/vL0lKTU2Vi8v/clz79u312Wef6dVXX9X//d//qVGjRlq6dKlatGjhqEMAAABOxmIYhuHoIpxNZmamfH19lZGRIR8fH0eXA8COdu7cqfDwcO3YsUNt2rRxdDkA7Kgk799OfwkMAADA3ghAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdAhAAADAdCo5ugAAt7fk5GRlZWU5ugyr/fv32/zXWXh7e6tRo0aOLgMwDQIQgDKTnJysxo0bO7qMQj3xxBOOLqGAQ4cOEYKAckIAAlBm8s/8LFiwQE2bNnVwNdddunRJR48eVUhIiDw9PR1djqTrZ6OeeOIJpzpTBtzuCEAAylzTpk3Vpk0bR5dh1aFDB0eXAMDBmAQNAABMhwAEAABMhwAEAABMhwAEAABMhwAEAABMhwAEAABMx+kDUFxcnO655x55e3urZs2a6tu3rw4ePHjDbeLj42WxWGweHh4e5VQxAABwdk4fgDZs2KCRI0dq69atSkhI0NWrV9WjRw9lZ2ffcDsfHx+dOnXK+jh27Fg5VQwAAJyd098IceXKlTbL8fHxqlmzpnbs2KHOnTsXuZ3FYlFAQECx9pGTk6OcnBzrcmZmZumKBQAAFYLTnwH6vYyMDElS9erVb9jvwoULqlu3roKDg9WnTx/t3bu3yL5xcXHy9fW1PoKDg+1aMwAAcC4VKgDl5eVp7Nix6tChg1q0aFFkvyZNmmju3LlatmyZFixYoLy8PLVv314nTpwotP/EiROVkZFhfRw/frysDgEAADgBp78E9lsjR47Unj17tGnTphv2i4iIUEREhHW5ffv2atq0qT766CO99tprBfq7u7vL3d3d7vUCAADnVGEC0KhRo7R8+XJt3LhRtWvXLtG2lStX1l133aXDhw+XUXUAAKAicfpLYIZhaNSoUVqyZInWrl2revXqlXiM3Nxc7d69W4GBgWVQIQAAqGic/gzQyJEj9dlnn2nZsmXy9vZWWlqaJMnX11eenp6SpIEDB+rOO+9UXFycJGnq1Klq166dGjZsqPPnz2vatGk6duyYhg0b5rDjAAAAzsPpA9Ds2bMlSV27drVpnzdvnmJiYiRJqampcnH538msc+fOafjw4UpLS1O1atUUHh6uzZs3q1mzZuVVNgAAcGJOH4AMw7hpn/Xr19ssT58+XdOnTy+jigAAQEXn9HOAAAAA7I0ABAAATIcABAAATIcABAAATMfpJ0EDqLgs1y7rrgAXeZ4/JJ3k762ieJ4/pLsCXGS5dtnRpQCmQQACUGY8LqRq51Ne0sanpI2OrsZ5NZW08ykv7b+QKqm9o8sBTIEABKDMXPaqozYfXdA///lPNQ0NdXQ5Tmv/gQN6/PHH9fcH6zi6FMA0CEAAyoxRyUM/puXpkl9jKSjM0eU4rUtpefoxLU9GJQ9HlwKYBhflAQCA6RCAAACA6RCAAACA6RCAAACA6RCAAACA6RCAAACA6RCAAACA6RCAAACA6XAjRABl5uLFi5KknTt3OriS/7l06ZKOHj2qkJAQeXp6OrocSdL+/fsdXQJgOgQgAGXmwIEDkqThw4c7uJKKwdvb29ElAKZBAAJQZvr27StJCg0NVZUqVRxbzP+3f/9+PfHEE1qwYIGaNm3q6HKsvL291ahRI0eXAZgGAQhAmalRo4aGDRvm6DIK1bRpU7Vp08bRZQBwECZBAwAA0yEAAQAA0yEAAQAA0yEAAQAA0yEAAQAA0yEAAQAA0yEAAQAA0yEAAQAA0yEAAQAA0yEAAQAA0yEAAQAA06kQAeiDDz5QSEiIPDw81LZtW33//fc37P/ll18qNDRUHh4eatmypVasWFFOlQIAgIrA6QPQwoULNW7cOE2ePFk7d+5U69atFRkZqV9//bXQ/ps3b1Z0dLSGDh2qH3/8UX379lXfvn21Z8+ecq4cAAA4K4thGIaji7iRtm3b6p577tGsWbMkSXl5eQoODtZzzz2nCRMmFOj/6KOPKjs7W8uXL7e2tWvXTmFhYZozZ06h+8jJyVFOTo51OTMzU8HBwcrIyJCPj4+djwhAaVy8eFEHDhy45XH279+vJ554QgsWLFDTpk3tUJkUGhqqKlWq2GUsAKWXmZkpX1/fYr1/VyqnmkrlypUr2rFjhyZOnGhtc3FxUffu3bVly5ZCt9myZYvGjRtn0xYZGamlS5cWuZ+4uDhNmTLFLjUDKBsHDhxQeHi43cZ74okn7DbWjh071KZNG7uNB6DsOXUAOnPmjHJzc1WrVi2b9lq1ahX5l2BaWlqh/dPS0orcz8SJE21CU/4ZIADOIzQ0VDt27LjlcS5duqSjR48qJCREnp6edqjsem0AKhanDkDlxd3dXe7u7o4uA8ANVKlSxW5nWTp06GCXcQBUXE49CbpGjRpydXVVenq6TXt6eroCAgIK3SYgIKBE/QEAgPk4dQByc3NTeHi4EhMTrW15eXlKTExUREREodtERETY9JekhISEIvsDAADzcfpLYOPGjdOgQYN09913695779WMGTOUnZ2twYMHS5IGDhyoO++8U3FxcZKkMWPGqEuXLnrnnXfUs2dPffHFF9q+fbs+/vhjRx4GAABwIk4fgB599FGdPn1akyZNUlpamsLCwrRy5UrrROfU1FS5uPzvRFb79u312Wef6dVXX9X//d//qVGjRlq6dKlatGjhqEMAAABOxunvA+QIJbmPAAAAcA4lef926jlAAAAAZYEABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATIcABAAATMfp7wTtCPn3hszMzHRwJQAAoLjy37eLc49nAlAhsrKyJEnBwcEOrgQAAJRUVlaWfH19b9iHr8IoRF5enk6ePClvb29ZLBZHlwPAjjIzMxUcHKzjx4/zVTfAbcYwDGVlZSkoKMjme0ILQwACYCp81x8AiUnQAADAhAhAAADAdAhAAEzF3d1dkydPlru7u6NLAeBAzAECAACmwxkgAABgOgQgAABgOgQgAABgOgQgAABgOgQgAOUqNjZWYWFhZbqPrl27auzYsdblkJAQzZgxo0z3CaBiIQABsIvfh46ijB8/XomJiWVf0G/88MMPGjFiRLH6EpYAc+DLUAGUC8MwlJubKy8vL3l5eZXrvv39/ct1fwCcH2eAANyymJgYbdiwQTNnzpTFYpHFYlF8fLwsFou+/fZbhYeHy93dXZs2bSpwCSwmJkZ9+/bVlClT5O/vLx8fHz399NO6cuVKsfadnZ2tgQMHysvLS4GBgXrnnXcK9PntWR3DMBQbG6s6derI3d1dQUFBGj16tKTrZ7GOHTum559/3nocknT27FlFR0frzjvvVJUqVdSyZUt9/vnnNvvo2rWrRo8erZdeeknVq1dXQECAYmNjbfqcP39eTz31lGrVqiUPDw+1aNFCy5cvt67ftGmTOnXqJE9PTwUHB2v06NHKzs4u1vMAoGQIQABu2cyZMxUREaHhw4fr1KlTOnXqlIKDgyVJEyZM0Jtvvqn9+/erVatWhW6fmJio/fv3a/369fr888+1ePFiTZkypVj7fvHFF7VhwwYtW7ZMq1ev1vr167Vz584i+3/11VeaPn26PvroIyUnJ2vp0qVq2bKlJGnx4sWqXbu2pk6daj0OSbp8+bLCw8P1zTffaM+ePRoxYoSefPJJff/99zZjz58/X1WrVtW2bdv09ttva+rUqUpISJAk5eXlKSoqSt99950WLFigffv26c0335Srq6sk6ciRI3rggQfUv39//fTTT1q4cKE2bdqkUaNGFet5AFBCBgDYQZcuXYwxY8ZYl9etW2dIMpYuXWrTb/LkyUbr1q2ty4MGDTKqV69uZGdnW9tmz55teHl5Gbm5uTfcZ1ZWluHm5mYsWrTI2nb27FnD09PTppa6desa06dPNwzDMN555x2jcePGxpUrVwod87d9b6Rnz57GCy+8YF3u0qWL0bFjR5s+99xzj/Hyyy8bhmEYq1atMlxcXIyDBw8WOt7QoUONESNG2LT95z//MVxcXIxLly7dtB4AJcMZIABl6u67775pn9atW6tKlSrW5YiICF24cEHHjx+/4XZHjhzRlStX1LZtW2tb9erV1aRJkyK3GTBggC5duqT69etr+PDhWrJkia5du3bD/eTm5uq1115Ty5YtVb16dXl5eWnVqlVKTU216ff7M1yBgYH69ddfJUlJSUmqXbu2GjduXOg+du3apfj4eOscKS8vL0VGRiovL08pKSk3rA9AyTEJGkCZqlq1qqNLsBEcHKyDBw9qzZo1SkhI0LPPPqtp06Zpw4YNqly5cqHbTJs2TTNnztSMGTPUsmVLVa1aVWPHji0wT+n321ssFuXl5UmSPD09b1jXhQsX9NRTT1nnI/1WnTp1SnKIAIqBAATALtzc3JSbm1uqbXft2qVLly5ZQ8LWrVvl5eVlnUdUlAYNGqhy5cratm2bNSScO3dOhw4dUpcuXYrcztPTU7169VKvXr00cuRIhYaGavfu3WrTpk2hx/Hdd9+pT58+euKJJyRdn89z6NAhNWvWrNjH2KpVK504cUKHDh0q9CxQmzZttG/fPjVs2LDYYwIoPS6BAbCLkJAQbdu2TUePHtWZM2esZz6K48qVKxo6dKj27dunFStWaPLkyRo1apRcXG78K8rLy0tDhw7Viy++qLVr12rPnj2KiYm54Xbx8fH6+9//rj179ujnn3/WggUL5Onpqbp161qPY+PGjfrll1905swZSVKjRo2UkJCgzZs3a//+/XrqqaeUnp5e7OOTpC5duqhz587q37+/EhISlJKSom+//VYrV66UJL388svavHmzRo0apaSkJCUnJ2vZsmVMggbKCAEIgF2MHz9erq6uatasmfz9/QvMj7mRbt26qVGjRurcubMeffRR9e7du8BHyIsybdo0derUSb169VL37t3VsWNHhYeHF9nfz89Pn3zyiTp06KBWrVppzZo1+vrrr3XHHXdIkqZOnaqjR4+qQYMG1vsHvfrqq2rTpo0iIyPVtWtXBQQEqG/fvsU+vnxfffWV7rnnHkVHR6tZs2Z66aWXrGebWrVqpQ0bNujQoUPq1KmT7rrrLk2aNElBQUEl3g+Am7MYhmE4uggA5hUTE6Pz589r6dKlji4FgIlwBggAAJgOAQiA00pNTbX5WPjvHyW5zAYAv8UlMABO69q1azp69GiR60NCQlSpEh9mBVByBCAAAGA6XAIDAACmQwACAACmQwACAACmQwACAACmQwACAACmQwACAACmQwACAACm8/8AvWkX9WPlRpcAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%sqlplot boxplot --table taxi_no_outliers --column trip_distance"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ffadf307-aae6-4ca1-922f-caa4fecbb036",
   "metadata": {},
   "source": [
    "### Bar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "f12be2fa-7d12-4379-a501-67071db2db5c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Removing NULLs, if there exists any from passenger_count</span>"
      ],
      "text/plain": [
       "Removing NULLs, if there exists any from passenger_count"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'taxi'}, xlabel='passenger_count', ylabel='Count'>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAArXElEQVR4nO3deVzVdb7H8fcBATfAHdBQ0NTAFHBB0ZsrhWZeuc017dqFLJ2pAdNoLK1c0im0RJ3UNKdRpybTrFzGpRExl5RSUUzMfcOrAjYquKIXzv3D65lhxBIEfvDl9Xw8zuPh+S2Hz+/YyGt+53fOsdntdrsAAAAM4WT1AAAAACWJuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBUKn5+fnp2WeftXoMACWIuAFQLm3btk0TJkzQxYsXrR4FQAVj47ulAJRHU6dO1ahRo3T8+HH5+fmV2s/Jzc2Vk5OTXFxcSu1nAChbVaweAACs5ObmZvUIAEoYL0sBKHcmTJigUaNGSZL8/f1ls9lks9l04sQJLViwQD179lSDBg3k5uamwMBAzZkzp8D+GzZskJOTk8aNG1dg+aJFi2Sz2QpszzU3gHk4cwOg3HnyySd16NAhffbZZ5o+fbrq1asnSapfv77mzJmjVq1a6d///d9VpUoV/fWvf9Vvf/tb5efnKyYmRpLUs2dP/fa3v1V8fLwiIyPVtm1bnT17VsOHD1d4eLheeOEFKw8PQCnjmhsA5dLdrrm5du2aqlWrVmDb3r176/Dhwzp69Khj2dWrVxUUFCQ3NzelpKToV7/6lbZs2aK9e/eqcePGju38/PzUvXt3LVy4sLQPCUAZ4WUpABXKP4dNdna2fvrpJ3Xr1k3Hjh1Tdna2Y1316tW1cOFC7d+/X127dtXq1as1ffr0AmEDwEyVOm42b96sfv36qWHDhrLZbFq+fHmRH8Nut2vq1Klq0aKF3Nzc1KhRI7399tslPywASdLWrVsVHh6uGjVqqFatWqpfv75ef/11SSoQN5LUpUsXvfjii9q+fbsiIiL03HPPWTEygDJWqa+5uXLlioKCgvTcc8/pySefLNZjjBgxQuvWrdPUqVPVunVrnT9/XufPny/hSQFI0tGjR9WrVy899NBDmjZtmnx9feXq6qo1a9Zo+vTpys/PL7B9bm6uNm7c6Nj36tWrql69ugWTAyhLlTpu+vTpoz59+tx1fW5urt544w199tlnunjxoh5++GFNmTJF3bt3lyTt379fc+bMUVpamlq2bCnp1js7ANw/m812x7K//vWvys3N1cqVKwu8vPTNN98U+hjjx4/X/v37NXXqVL322msaPXq03n///VKbGUD5UKlflvolsbGxSk5O1uLFi/XDDz9owIABjgsXpVv/0DZt2lSrVq2Sv7+//Pz8NHToUM7cACWgRo0aklTgE4qdnZ0l3Xo5+Lbs7GwtWLDgjv2///57TZ06VSNHjtQrr7yiUaNGadasWdq0aVPpDg7Acrxb6v/ZbDYtW7ZMkZGRkqT09HQ1bdpU6enpatiwoWO78PBwhYaG6p133tELL7yghQsXKjg4WO+9957y8vL08ssvq3bt2tqwYYNFRwKYYceOHQoNDdXjjz+uQYMGycXFRQEBAQoNDVXLli31m9/8RpcvX9Yf//hH1axZU3v27HG8s+r69esKDg6WzWbT7t27VbVqVd24cUNt27bV1atXtXfvXkc88W4pwDyV+mWpn7N3717l5eWpRYsWBZbn5uaqbt26kqT8/Hzl5ubq448/dmz3pz/9Se3atdPBgwcdL1UBKLoOHTpo0qRJmjt3rr7++mvl5+fr+PHj+uKLL/Tmm2/qd7/7nby9vfXiiy+qfv36BS4Wfv3113XkyBFt27ZNVatWlSS5urrqz3/+szp16qRRo0bpgw8+sOrQAJQyztz8v389c7NkyRINHjxY+/btc5wKv61mzZry9vbW+PHj9c477+jmzZuOddeuXVP16tW1bt06Pfroo2V5CAAAQJy5uauQkBDl5eUpKytLjzzySKHbdOnSRf/7v/+ro0ePqlmzZpKkQ4cOSZKaNGlSZrMCAIB/qNRnbi5fvqwjR45IuhUz06ZNU48ePVSnTh01btxYzzzzjLZu3aqEhASFhITo3LlzSkpKUps2bdS3b1/l5+erQ4cOqlmzpmbMmOH4+HcPDw+tW7fO4qMDAKByqtRxs3HjRvXo0eOO5dHR0Vq4cKFu3ryp3//+9/r44491+vRp1atXT506ddJbb72l1q1bS5LOnDmj4cOHa926dapRo4b69OmjhIQE1alTp6wPBwAAqJLHDQAAMA+fcwMAAIxC3AAAAKNUundL5efn68yZM3J3dy/0490BAED5Y7fbdenSJTVs2FBOTj9/bqbSxc2ZM2fk6+tr9RgAAKAYTp06pQceeOBnt6l0cePu7i7p1pPj4eFh8TQAAOBe5OTkyNfX1/F7/OdUuri5/VKUh4cHcQMAQAVzL5eUcEExAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjVLF6AJQPfqNXWz3CHU5M7mv1CACACogzNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxiadzEx8erQ4cOcnd3V4MGDRQZGamDBw/+4n5Lly7VQw89pKpVq6p169Zas2ZNGUwLAAAqAkvjZtOmTYqJidF3332nxMRE3bx5U4899piuXLly1322bdump59+Ws8//7x2796tyMhIRUZGKi0trQwnBwAA5ZXNbrfbrR7itnPnzqlBgwbatGmTunbtWug2AwcO1JUrV7Rq1SrHsk6dOik4OFhz5879xZ+Rk5MjT09PZWdny8PDo8Rmr+j8Rq+2eoQ7nJjc1+oRAADlRFF+f5era26ys7MlSXXq1LnrNsnJyQoPDy+wLCIiQsnJyYVun5ubq5ycnAI3AABgrnITN/n5+Ro5cqS6dOmihx9++K7bZWRkyMvLq8AyLy8vZWRkFLp9fHy8PD09HTdfX98SnRsAAJQv5SZuYmJilJaWpsWLF5fo444ZM0bZ2dmO26lTp0r08QEAQPlSxeoBJCk2NlarVq3S5s2b9cADD/zstt7e3srMzCywLDMzU97e3oVu7+bmJjc3txKbFQAAlG+Wnrmx2+2KjY3VsmXLtGHDBvn7+//iPmFhYUpKSiqwLDExUWFhYaU1JgAAqEAsPXMTExOjRYsWacWKFXJ3d3dcN+Pp6alq1apJkqKiotSoUSPFx8dLkkaMGKFu3bopISFBffv21eLFi7Vz507NmzfPsuMAAADlh6VnbubMmaPs7Gx1795dPj4+jtuSJUsc26Snp+vs2bOO+507d9aiRYs0b948BQUF6YsvvtDy5ct/9iJkAABQeVh65uZePmJn48aNdywbMGCABgwYUAoTAQCAiq7cvFsKAACgJBA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADCKpXGzefNm9evXTw0bNpTNZtPy5ct/dvuNGzfKZrPdccvIyCibgQEAQLlnadxcuXJFQUFBmj17dpH2O3jwoM6ePeu4NWjQoJQmBAAAFU0VK394nz591KdPnyLv16BBA9WqVavkBwIAABVehbzmJjg4WD4+Pnr00Ue1devWn902NzdXOTk5BW4AAMBcFSpufHx8NHfuXH355Zf68ssv5evrq+7du2vXrl133Sc+Pl6enp6Om6+vbxlODAAAyprNbrfbrR5Ckmw2m5YtW6bIyMgi7detWzc1btxYn3zySaHrc3NzlZub67ifk5MjX19fZWdny8PD435GNorf6NVWj3CHE5P7Wj0CAKCcyMnJkaen5z39/rb0mpuSEBoaqm+//fau693c3OTm5laGEwEAACtVqJelCpOamiofHx+rxwAAAOWEpWduLl++rCNHjjjuHz9+XKmpqapTp44aN26sMWPG6PTp0/r4448lSTNmzJC/v79atWql69ev66OPPtKGDRu0bt06qw4BAACUM5bGzc6dO9WjRw/H/bi4OElSdHS0Fi5cqLNnzyo9Pd2x/saNG3rllVd0+vRpVa9eXW3atNH69esLPAYAAKjcys0FxWWlKBckVSZcUAwAKM+K8vu7wl9zAwAA8M+IGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYpVtw0bdpUf//73+9YfvHiRTVt2vS+hwIAACiuYsXNiRMnlJeXd8fy3NxcnT59+r6HAgAAKK4qRdl45cqVjj//7W9/k6enp+N+Xl6ekpKS5OfnV2LDAQAAFFWR4iYyMlKSZLPZFB0dXWCdi4uL/Pz8lJCQUGLDAQAAFFWR4iY/P1+S5O/vrx07dqhevXqlMhQAAEBxFSlubjt+/HhJzwEAAFAiihU3kpSUlKSkpCRlZWU5zujcNn/+/PseDAAAoDiKFTdvvfWWJk6cqPbt28vHx0c2m62k5wIAACiWYsXN3LlztXDhQv33f/93Sc8DAABwX4r1OTc3btxQ586dS3oWAACA+1asuBk6dKgWLVpU0rMAAADct2K9LHX9+nXNmzdP69evV5s2beTi4lJg/bRp00pkOAAAgKIqVtz88MMPCg4OliSlpaUVWMfFxQAAwErFiptvvvmmpOcAAAAoEcW65gYAAKC8KtaZmx49evzsy08bNmwo9kAAAAD3o1hxc/t6m9tu3ryp1NRUpaWl3fGFmgAAAGWpWHEzffr0QpdPmDBBly9fvq+BAAAA7keJXnPzzDPP8L1SAADAUiUaN8nJyapatWpJPiQAAECRFOtlqSeffLLAfbvdrrNnz2rnzp0aO3ZsiQwGAABQHMWKG09PzwL3nZyc1LJlS02cOFGPPfZYiQwGAABQHMWKmwULFpT0HAAAACWiWHFzW0pKivbv3y9JatWqlUJCQkpkKAAAgOIqVtxkZWVp0KBB2rhxo2rVqiVJunjxonr06KHFixerfv36JTkjAADAPSvWu6WGDx+uS5cuad++fTp//rzOnz+vtLQ05eTk6KWXXirpGQEAAO5Zsc7cfP3111q/fr0CAgIcywIDAzV79mwuKAYAAJYq1pmb/Px8ubi43LHcxcVF+fn59z0UAABAcRUrbnr27KkRI0bozJkzjmWnT5/Wyy+/rF69epXYcAAAAEVVrLiZNWuWcnJy5Ofnp2bNmqlZs2by9/dXTk6OZs6cWdIzAgAA3LNiXXPj6+urXbt2af369Tpw4IAkKSAgQOHh4SU6HAAAQFEV6czNhg0bFBgYqJycHNlsNj366KMaPny4hg8frg4dOqhVq1basmVLac0KAADwi4oUNzNmzNCwYcPk4eFxxzpPT0/95je/0bRp00psOAAAgKIqUtzs2bNHvXv3vuv6xx57TCkpKfc9FAAAQHEVKW4yMzMLfQv4bVWqVNG5c+fueygAAIDiKlLcNGrUSGlpaXdd/8MPP8jHx+e+hwIAACiuIsXN448/rrFjx+r69et3rLt27ZrGjx+vJ554osSGAwAAKKoivRX8zTff1FdffaUWLVooNjZWLVu2lCQdOHBAs2fPVl5ent54441SGRQAAOBeFCluvLy8tG3bNr344osaM2aM7Ha7JMlmsykiIkKzZ8+Wl5dXqQwKAABwL4r8IX5NmjTRmjVrdOHCBR05ckR2u13NmzdX7dq1S2M+AACAIinWJxRLUu3atdWhQ4eSnAUAAOC+Feu7pQAAAMor4gYAABjF0rjZvHmz+vXrp4YNG8pms2n58uW/uM/GjRvVtm1bubm56cEHH9TChQtLfU4AAFBxWBo3V65cUVBQkGbPnn1P2x8/flx9+/ZVjx49lJqaqpEjR2ro0KH629/+VsqTAgCAiqLYFxSXhD59+qhPnz73vP3cuXPl7++vhIQESVJAQIC+/fZbTZ8+XREREaU1JgAAqEAq1DU3ycnJCg8PL7AsIiJCycnJd90nNzdXOTk5BW4AAMBcFSpuMjIy7viQQC8vL+Xk5OjatWuF7hMfHy9PT0/HzdfXtyxGBQAAFqlQcVMcY8aMUXZ2tuN26tQpq0cCAAClyNJrborK29tbmZmZBZZlZmbKw8ND1apVK3QfNzc3ubm5lcV4AACgHKhQZ27CwsKUlJRUYFliYqLCwsIsmggAAJQ3lsbN5cuXlZqaqtTUVEm33uqdmpqq9PR0SbdeUoqKinJs/8ILL+jYsWN69dVXdeDAAX3wwQf6/PPP9fLLL1sxPgAAKIcsjZudO3cqJCREISEhkqS4uDiFhIRo3LhxkqSzZ886QkeS/P39tXr1aiUmJiooKEgJCQn66KOPeBs4AABwsNntdrvVQ5SlnJwceXp6Kjs7Wx4eHlaPU274jV5t9Qh3ODG5r9UjAADKiaL8/q5Q19wAAAD8EuIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYpF3Eze/Zs+fn5qWrVqurYsaO2b99+120XLlwom81W4Fa1atUynBYAAJRnlsfNkiVLFBcXp/Hjx2vXrl0KCgpSRESEsrKy7rqPh4eHzp4967idPHmyDCcGAADlmeVxM23aNA0bNkxDhgxRYGCg5s6dq+rVq2v+/Pl33cdms8nb29tx8/LyKsOJAQBAeWZp3Ny4cUMpKSkKDw93LHNyclJ4eLiSk5Pvut/ly5fVpEkT+fr6qn///tq3b99dt83NzVVOTk6BGwAAMJelcfPTTz8pLy/vjjMvXl5eysjIKHSfli1bav78+VqxYoX+8pe/KD8/X507d9b//M//FLp9fHy8PD09HTdfX98SPw4AAFB+WP6yVFGFhYUpKipKwcHB6tatm7766ivVr19fH374YaHbjxkzRtnZ2Y7bqVOnynhiAABQlqpY+cPr1asnZ2dnZWZmFliemZkpb2/ve3oMFxcXhYSE6MiRI4Wud3Nzk5ub233PCgAAKgZLz9y4urqqXbt2SkpKcizLz89XUlKSwsLC7ukx8vLytHfvXvn4+JTWmAAAoAKx9MyNJMXFxSk6Olrt27dXaGioZsyYoStXrmjIkCGSpKioKDVq1Ejx8fGSpIkTJ6pTp0568MEHdfHiRb333ns6efKkhg4dauVhAACAcsLyuBk4cKDOnTuncePGKSMjQ8HBwfr6668dFxmnp6fLyekfJ5guXLigYcOGKSMjQ7Vr11a7du20bds2BQYGWnUIAACgHLHZ7Xa71UOUpZycHHl6eio7O1seHh5Wj1Nu+I1ebfUIdzgxua/VIwAAyomi/P62/MwNcD+IMgDAv6pwbwUHAAD4OcQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoVaweAKiM/EavtnqEO5yY3NfqEQCgRHDmBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBR+JwbAPeMz+cBUBEQNyWMf/wBALAWcQPAePyfDqBy4ZobAABglHJx5mb27Nl67733lJGRoaCgIM2cOVOhoaF33X7p0qUaO3asTpw4oebNm2vKlCl6/PHHy3BiACh9nHECisfyMzdLlixRXFycxo8fr127dikoKEgRERHKysoqdPtt27bp6aef1vPPP6/du3crMjJSkZGRSktLK+PJAQBAeWR53EybNk3Dhg3TkCFDFBgYqLlz56p69eqaP39+odv/4Q9/UO/evTVq1CgFBARo0qRJatu2rWbNmlXGkwMAgPLI0ri5ceOGUlJSFB4e7ljm5OSk8PBwJScnF7pPcnJyge0lKSIi4q7bAwCAysXSa25++ukn5eXlycvLq8ByLy8vHThwoNB9MjIyCt0+IyOj0O1zc3OVm5vruJ+dnS1JysnJuZ/R7yo/92qpPO79uJdjZe6Sw9xli7nLVmn92wn8ktv/7dnt9l/ctlxcUFya4uPj9dZbb92x3NfX14JprOE5w+oJioe5yxZzly3mBorn0qVL8vT0/NltLI2bevXqydnZWZmZmQWWZ2Zmytvbu9B9vL29i7T9mDFjFBcX57ifn5+v8+fPq27durLZbPd5BKUjJydHvr6+OnXqlDw8PKwex3g832WL57ts8XyXLZ7v0mO323Xp0iU1bNjwF7e1NG5cXV3Vrl07JSUlKTIyUtKt+EhKSlJsbGyh+4SFhSkpKUkjR450LEtMTFRYWFih27u5ucnNza3Aslq1apXE+KXOw8OD/3GUIZ7vssXzXbZ4vssWz3fp+KUzNrdZ/rJUXFycoqOj1b59e4WGhmrGjBm6cuWKhgwZIkmKiopSo0aNFB8fL0kaMWKEunXrpoSEBPXt21eLFy/Wzp07NW/ePCsPAwAAlBOWx83AgQN17tw5jRs3ThkZGQoODtbXX3/tuGg4PT1dTk7/eFNX586dtWjRIr355pt6/fXX1bx5cy1fvlwPP/ywVYcAAADKEcvjRpJiY2Pv+jLUxo0b71g2YMAADRgwoJSnso6bm5vGjx9/x8tpKB0832WL57ts8XyXLZ7v8sFmv5f3VAEAAFQQln9CMQAAQEkibgAAgFGIGwAAYBTiBgAAGIW4KYdmz54tPz8/Va1aVR07dtT27dutHslI8fHx6tChg9zd3dWgQQNFRkbq4MGDVo9VaUyePFk2m63AB3KiZJ0+fVrPPPOM6tatq2rVqql169bauXOn1WMZKS8vT2PHjpW/v7+qVaumZs2aadKkSff0PUgoecRNObNkyRLFxcVp/Pjx2rVrl4KCghQREaGsrCyrRzPOpk2bFBMTo++++06JiYm6efOmHnvsMV25csXq0Yy3Y8cOffjhh2rTpo3VoxjrwoUL6tKli1xcXLR27Vr9+OOPSkhIUO3ata0ezUhTpkzRnDlzNGvWLO3fv19TpkzRu+++q5kzZ1o9WqXEW8HLmY4dO6pDhw6aNWuWpFtfR+Hr66vhw4dr9OjRFk9ntnPnzqlBgwbatGmTunbtavU4xrp8+bLatm2rDz74QL///e8VHBysGTNmWD2WcUaPHq2tW7dqy5YtVo9SKTzxxBPy8vLSn/70J8eyX/3qV6pWrZr+8pe/WDhZ5cSZm3Lkxo0bSklJUXh4uGOZk5OTwsPDlZycbOFklUN2drYkqU6dOhZPYraYmBj17du3wH/nKHkrV65U+/btNWDAADVo0EAhISH64x//aPVYxurcubOSkpJ06NAhSdKePXv07bffqk+fPhZPVjmVi08oxi0//fST8vLyHF89cZuXl5cOHDhg0VSVQ35+vkaOHKkuXbrwVR6laPHixdq1a5d27Nhh9SjGO3bsmObMmaO4uDi9/vrr2rFjh1566SW5uroqOjra6vGMM3r0aOXk5Oihhx6Ss7Oz8vLy9Pbbb2vw4MFWj1YpETeAbp1NSEtL07fffmv1KMY6deqURowYocTERFWtWtXqcYyXn5+v9u3b65133pEkhYSEKC0tTXPnziVuSsHnn3+uTz/9VIsWLVKrVq2UmpqqkSNHqmHDhjzfFiBuypF69erJ2dlZmZmZBZZnZmbK29vboqnMFxsbq1WrVmnz5s164IEHrB7HWCkpKcrKylLbtm0dy/Ly8rR582bNmjVLubm5cnZ2tnBCs/j4+CgwMLDAsoCAAH355ZcWTWS2UaNGafTo0Ro0aJAkqXXr1jp58qTi4+OJGwtwzU054urqqnbt2ikpKcmxLD8/X0lJSQoLC7NwMjPZ7XbFxsZq2bJl2rBhg/z9/a0eyWi9evXS3r17lZqa6ri1b99egwcPVmpqKmFTwrp06XLHRxscOnRITZo0sWgis129elVOTgV/pTo7Oys/P9+iiSo3ztyUM3FxcYqOjlb79u0VGhqqGTNm6MqVKxoyZIjVoxknJiZGixYt0ooVK+Tu7q6MjAxJkqenp6pVq2bxdOZxd3e/43qmGjVqqG7dulznVApefvllde7cWe+8846eeuopbd++XfPmzdO8efOsHs1I/fr109tvv63GjRurVatW2r17t6ZNm6bnnnvO6tEqJd4KXg7NmjVL7733njIyMhQcHKz3339fHTt2tHos49hstkKXL1iwQM8++2zZDlNJde/enbeCl6JVq1ZpzJgxOnz4sPz9/RUXF6dhw4ZZPZaRLl26pLFjx2rZsmXKyspSw4YN9fTTT2vcuHFydXW1erxKh7gBAABG4ZobAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwCoAGw2m5YvX271GECFQNwAqLTy8vL4YkPAQMQNUEl0795dsbGxio2Nlaenp+rVq6exY8fq9jewfPLJJ2rfvr3c3d3l7e2t//qv/1JWVpZj/wsXLmjw4MGqX7++qlWrpubNm2vBggWSpBs3big2NlY+Pj6qWrWqmjRpovj4eMe+Fy9e1NChQ1W/fn15eHioZ8+e2rNnj2P9hAkTFBwcrE8++UR+fn7y9PTUoEGDdOnSJcc2ly5d0uDBg1WjRg35+Pho+vTp6t69u0aOHOnYJjc3V7/73e/UqFEj1ahRQx07dtTGjRsd6xcuXKhatWpp5cqVCgwMlJubm9LT03/xuZs/f75atWolNzc3+fj4KDY21rEuPT1d/fv3V82aNeXh4aGnnnpKmZmZjvXPPvusIiMjCzzeyJEj1b179wJ/Ny+99JJeffVV1alTR97e3powYYJjvZ+fnyTpP/7jP2Sz2Rz3ARSOuAEqkT//+c+qUqWKtm/frj/84Q+aNm2aPvroI0nSzZs3NWnSJO3Zs0fLly/XiRMnCnyB6NixY/Xjjz9q7dq12r9/v+bMmaN69epJkt5//32tXLlSn3/+uQ4ePKhPP/20wC/gAQMGKCsrS2vXrlVKSoratm2rXr166fz5845tjh49quXLl2vVqlVatWqVNm3apMmTJzvWx8XFaevWrVq5cqUSExO1ZcsW7dq1q8DxxcbGKjk5WYsXL9YPP/ygAQMGqHfv3jp8+LBjm6tXr2rKlCn66KOPtG/fPjVo0OBnn7M5c+YoJiZGv/71r7V3716tXLlSDz74oCQpPz9f/fv31/nz57Vp0yYlJibq2LFjGjhwYNH+YnTr76ZGjRr6/vvv9e6772rixIlKTEyUJO3YsUPSrS91PXv2rOM+gLuwA6gUunXrZg8ICLDn5+c7lr322mv2gICAQrffsWOHXZL90qVLdrvdbu/Xr599yJAhhW47fPhwe8+ePQs89m1btmyxe3h42K9fv15gebNmzewffvih3W6328ePH2+vXr26PScnx7F+1KhR9o4dO9rtdrs9JyfH7uLiYl+6dKlj/cWLF+3Vq1e3jxgxwm632+0nT560Ozs720+fPl3g5/Tq1cs+ZswYu91uty9YsMAuyZ6amlrocRSmYcOG9jfeeKPQdevWrbM7Ozvb09PTHcv27dtnl2Tfvn273W6326Ojo+39+/cvsN+IESPs3bp1c9zv1q2b/d/+7d8KbNOhQwf7a6+95rgvyb5s2bJ7nhuozDhzA1QinTp1ks1mc9wPCwvT4cOHlZeXp5SUFPXr10+NGzeWu7u7unXrJkmOl21efPFFLV68WMHBwXr11Ve1bds2x+M8++yzSk1NVcuWLfXSSy9p3bp1jnV79uzR5cuXVbduXdWsWdNxO378uI4ePerYzs/PT+7u7o77Pj4+jpfFjh07pps3byo0NNSx3tPTUy1btnTc37t3r/Ly8tSiRYsCP2fTpk0Ffo6rq6vatGlzT89XVlaWzpw5o169ehW6fv/+/fL19ZWvr69jWWBgoGrVqqX9+/ff08+47V9n+ufjB1A0VaweAID1rl+/roiICEVEROjTTz9V/fr1lZ6eroiICN24cUOS1KdPH508eVJr1qxRYmKievXqpZiYGE2dOlVt27bV8ePHtXbtWq1fv15PPfWUwsPD9cUXX+jy5cvy8fEpcO3LbbVq1XL82cXFpcA6m81WpIt9L1++LGdnZ6WkpMjZ2bnAupo1azr+XK1atQKB93OqVat2zz//bpycnBzXNd128+bNO7a73+MH8A/EDVCJfP/99wXuf/fdd2revLkOHDigv//975o8ebLjLMTOnTvv2L9+/fqKjo5WdHS0HnnkEY0aNUpTp06VJHl4eGjgwIEaOHCg/vM//1O9e/fW+fPn1bZtW2VkZKhKlSrFvhC2adOmcnFx0Y4dO9S4cWNJUnZ2tg4dOqSuXbtKkkJCQpSXl6esrCw98sgjxfo5/8rd3V1+fn5KSkpSjx497lgfEBCgU6dO6dSpU47n7ccff9TFixcVGBgo6dZzlpaWVmC/1NTUO2Lml7i4uCgvL6+YRwJULrwsBVQi6enpiouL08GDB/XZZ59p5syZGjFihBo3bixXV1fNnDlTx44d08qVKzVp0qQC+44bN04rVqzQkSNHtG/fPq1atUoBAQGSpGnTpumzzz7TgQMHdOjQIS1dulTe3t6qVauWwsPDFRYWpsjISK1bt04nTpzQtm3b9MYbbxQaUIVxd3dXdHS0Ro0apW+++Ub79u3T888/LycnJ8dZmBYtWmjw4MGKiorSV199pePHj2v79u2Kj4/X6tWri/2cTZgwQQkJCXr//fd1+PBh7dq1SzNnzpQkhYeHq3Xr1ho8eLB27dql7du3KyoqSt26dVP79u0lST179tTOnTv18ccf6/Dhwxo/fvwdsXMvbkdWRkaGLly4UOzjASoD4gaoRKKionTt2jWFhoYqJiZGI0aM0K9//WvVr19fCxcu1NKlSxUYGKjJkyc7zsjc5urqqjFjxqhNmzbq2rWrnJ2dtXjxYkm34uPdd99V+/bt1aFDB504cUJr1qxxxMeaNWvUtWtXDRkyRC1atNCgQYN08uRJeXl53fPs06ZNU1hYmJ544gmFh4erS5cuCggIUNWqVR3bLFiwQFFRUXrllVfUsmVLRUZGFjjbUxzR0dGaMWOGPvjgA7Vq1UpPPPGE491XNptNK1asUO3atdW1a1eFh4eradOmWrJkiWP/iIgIjR07Vq+++qo6dOigS5cuKSoqqshzJCQkKDExUb6+vgoJCSn28QCVgc3+ry8GAzBS9+7dFRwcrBkzZlg9Som4cuWKGjVqpISEBD3//PNWjwOgHOGaGwAVwu7du3XgwAGFhoYqOztbEydOlCT179/f4skAlDfEDYAKY+rUqTp48KBcXV3Vrl07bdmyxfFBgsX1z++k+ldr164tsYuTAZQdXpYCUKkdOXLkrusaNWpUIm8HB1C2iBsAAGAU3i0FAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMMr/AaFYKFVAWOEpAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%sqlplot bar --table taxi --column passenger_count"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "afc3a091-58b4-42be-89e0-ffefc9f22003",
   "metadata": {},
   "source": [
    "## Plotting using the `ggplot` API\n",
    "\n",
    "You can also use the `ggplot` API to create visualizations:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "8732b80d-6dc4-42b1-b503-3fa039f66f4b",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from sql.ggplot import ggplot, aes, geom_histogram"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "9a82b4f3-36de-4e77-ba3f-ecc88be9d4c1",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sql.ggplot.ggplot.ggplot at 0x15e0bae30>"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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rl276rXXXrOsjyufA0lq2rSpy+P97rvvrvq8lo5XxtVeIx8fH7Vr167S27HKiRMnlJeXp6VLlyooKMjlNmLECEk/XSxxufLeJzfynkbdwzlVwE1077336uuvv9aHH36oTz75RG+//bbmzJmjJUuWuBw5udmu/Ne3JP3qV7/S9u3bNWHCBPXs2VONGzdWSUmJBg4cWO5VT15eXpVaJqnMifVW9Hu9bma/l8vLy9N9990nm82mGTNmqH379vLz89OePXs0ceLEcp/b0ikTcnJydOrUKYWGhlrSy814vFVx5fl6pYqLi6/a8/UqfZ6ffPJJxcfHl1tz5dHn8v7e1dT3NNyDUAXcZIGBgRoxYoRGjBihc+fO6d5779W0adPM/wFf7QOldevW2rhxo86ePetytKr066LWrVub/y0pKVF2drY6duxo1h0+fLjSPZ45c0bp6emaPn26pkyZYi6vqV9xlD72rKysMmOHDh1S8+bN1ahRo5va09Vexy1btujUqVP65z//6XLye3Z2drn1S5YsUVpamn73u99p5syZeu655/Thhx9WS8/lad269VWf19Lxym5H+uk1ateunbm8qKhI2dnZio6ONpc1bdq0zBWB0k9Huy5f92rPcWUEBQWpSZMmKi4udtl3VVT0nkb9wdd/wE105XQEjRs3VocOHVRYWGguK/3wv/JD5cEHH1RxcbEWLFjgsnzOnDny8PDQoEGDJEkxMTGSfrp0/XJvvfVWpfssPRpw5RGLuXPnVnobN1OLFi3Us2dPLVu2zOV5279/vz755BM9+OCDN72nq72O5T23RUVFZV4v6aegNWHCBMXFxek3v/mN/vjHP+qjjz4qd9qD6vLggw9q586dysjIMJcVFBRo6dKlatOmjSIiIiq1nejoaPn4+Gj+/Pkuj/2//uu/lJ+f73J1avv27fXZZ5+5zD+2Zs0aHT161GWbV3uOK8PLy0txcXF6//33tX///jLjJ06cqNR2KvOeRv3BkSrgJoqIiND999+vXr16KTAwULt379Y//vEPjRkzxqzp1auXJGns2LGKiYmRl5eXhg0bpocfflj9+/fXK6+8om+//VY9evTQJ598og8//FDjxo1T+/btzfXj4uI0d+5cnTp1ypxS4csvv5RUuX/d22w23XvvvZo1a5YuXryoW265RZ988slVj6bUBLNnz9agQYMUFRWlhIQEc0oFu93ultnpe/bsKS8vL/3hD39Qfn6+fH199bOf/Ux33nmnmjZtqvj4eI0dO1YeHh76y1/+UibAGoahkSNHyt/fX4sXL5YkPffcc3r//ff1wgsvKDo6WmFhYdX+OCZNmqS///3vGjRokMaOHavAwEAtW7ZM2dnZev/99yv9iwFBQUGaPHmypk+froEDB+qRRx5RVlaWFi1apD59+pjnlEk/XUTwj3/8QwMHDtSvfvUrff311/rrX/9q/h0v1b59ewUEBGjJkiVq0qSJGjVqpMjIyHLPfSrPG2+8oc2bNysyMlLPPvusIiIidPr0ae3Zs0cbN27U6dOnK9xGZd7TqEfccs0hUAuVTqlw5eXspcqbAuDKS8Nff/11o2/fvkZAQIDh7+9vdO7c2fjd735nFBUVmTWXLl0ykpKSjKCgIMPDw8NleoWzZ88a48ePN8LCwgxvb2+jY8eOxuzZs42SkhKX/RYUFBiJiYlGYGCg0bhxY2Pw4MFGVlaWIcllyoDS6QVOnDhR5vF8//33xi9/+UsjICDAsNvtxmOPPWbk5ORcdVqGK7cRHx9vNGrUqFLPU3muNaXC7Nmzy11n48aNxl133WX4+/sbNpvNePjhh42DBw+61FRXv+X5z//8T6Ndu3aGl5eXy/QKn376qdGvXz/D39/fCAsLM15++WVjw4YNLjXz5s0zJBnvv/++yzaPHDli2Gw248EHH3TpsSpTKpQ3FUB52/r666+NIUOGGAEBAYafn5/Rt29fY82aNde1v1ILFiwwOnfubHh7exshISHG6NGjjTNnzpSpe/PNN41bbrnF8PX1Ne666y5j9+7d5fb24YcfGhEREUaDBg1cpleozJQKhmEYubm5RmJiohEeHm54e3sboaGhxgMPPGAsXbrUrCmdUmHVqlVl+qzMexr1h4dhuPmMRAA3xd69e3X77bfrr3/9q5544gl3twMAdQ7nVAF1UOnM45ebO3euPD09r2tmcABA5XFOFVAHzZo1S5mZmerfv78aNGig9evXa/369Ro1apTCw8Pd3R6q0YkTJ1x+Q/BKPj4+LhOk1tZ9AjURX/8BdVBaWpqmT5+ugwcP6ty5c2rVqpWeeuopvfLKK2rQgH9L1WVt2rS55kSa9913n/nDzrV5n0BNRKgCgDrk008/Lffr31JNmzY1rzCtzfsEaiJCFQAAgAU4UR0AAMACnFxxE5WUlCgnJ0dNmjS5oZ9XAAAAN49hGDp79qzCwsKuOeEtoeomysnJ4corAABqqaNHj6ply5ZXHSdU3USlP4J79OhR2Ww2N3cDAAAqw+l0Kjw83OXH7MtDqLqJSr/ys9lshCoAAGqZik7d4UR1AAAACxCqAAAALECoAgAAsADnVAEAgGsyDEOXLl265m881mZeXl5q0KDBDU93RKgCAABXVVRUpGPHjunHH390dyvVqmHDhmrRooV8fHyqvA1CFQAAKFdJSYmys7Pl5eWlsLAw+fj41LnJqw3DUFFRkU6cOKHs7Gx17NjxmhN8XguhCgAAlKuoqEglJSUKDw9Xw4YN3d1OtfH395e3t7e+++47FRUVyc/Pr0rb4UR1AABwTVU9clObWPEY6/6zBAAAcBMQqgAAACzAOVUAAOC6lThuvWn78gz98qbt60ZwpAoAANQ527Zt08MPP6ywsDB5eHho9erV1b5PQhUAAKhzCgoK1KNHDy1cuPCm7ZOv/wAAQJ0zaNAgDRo06Kbuk1CFG3Yj36vXlu/JAQCoCF//AQAAWIBQBQAAYAFCFQAAgAUIVQAAABbgRHUAAFDnnDt3TocPHzbvZ2dna+/evQoMDFSrVq2qZZ+EKgAAcN1q+tXbu3fvVv/+/c37ycnJkqT4+HilpKRUyz4JVQAAoM65//77ZRjGTd0n51QBAABYgFAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABYgVAEAAFiAGdUBAMB1azf/zZu2r2/GvnjT9nUjOFIFAADqnJkzZ6pPnz5q0qSJgoODNXjwYGVlZVXrPt0aqtq0aSMPD48yt8TEREnShQsXlJiYqGbNmqlx48aKi4tTbm6uyzaOHDmi2NhYNWzYUMHBwZowYYIuXbrkUrNlyxbdcccd8vX1VYcOHcr9IcWFCxeqTZs28vPzU2RkpHbu3OkyXpleAABAzbB161YlJibqs88+U1pami5evKgBAwaooKCg2vbp1lC1a9cuHTt2zLylpaVJkh577DFJ0vjx4/Xxxx9r1apV2rp1q3JycvToo4+a6xcXFys2NlZFRUXavn27li1bppSUFE2ZMsWsyc7OVmxsrPr376+9e/dq3LhxeuaZZ7RhwwazZsWKFUpOTtbUqVO1Z88e9ejRQzExMTp+/LhZU1EvAACg5khNTdXw4cPVtWtX9ejRQykpKTpy5IgyMzOrbZ8exs3+CedrGDdunNasWaOvvvpKTqdTQUFBWr58uYYMGSJJOnTokLp06aKMjAz169dP69ev10MPPaScnByFhIRIkpYsWaKJEyfqxIkT8vHx0cSJE7V27Vrt37/f3M+wYcOUl5en1NRUSVJkZKT69OmjBQsWSJJKSkoUHh6upKQkTZo0Sfn5+RX2UhlOp1N2u135+fmy2WyWPW/uVuK4tcrreoZ+aWEnAAArXbhwQdnZ2Wrbtq38/PxcxmrbOVWHDx9Wx44dtW/fPt12221lxq/1WCv7+V1jzqkqKirSX//6V40cOVIeHh7KzMzUxYsXFR0dbdZ07txZrVq1UkZGhiQpIyND3bp1MwOVJMXExMjpdOrAgQNmzeXbKK0p3UZRUZEyMzNdajw9PRUdHW3WVKaX8hQWFsrpdLrcAADAzVVSUqJx48bprrvuKjdQWaXGhKrVq1crLy9Pw4cPlyQ5HA75+PgoICDApS4kJEQOh8OsuTxQlY6Xjl2rxul06vz58zp58qSKi4vLrbl8GxX1Up6ZM2fKbrebt/Dw8IqfCAAAYKnExETt379f7733XrXup8aEqv/6r//SoEGDFBYW5u5WLDN58mTl5+ebt6NHj7q7JQAA6pUxY8ZozZo12rx5s1q2bFmt+6oR81R999132rhxo/75z3+ay0JDQ1VUVKS8vDyXI0S5ubkKDQ01a668Sq/0irzLa668Si83N1c2m03+/v7y8vKSl5dXuTWXb6OiXsrj6+srX1/fSj4LAADAKoZhKCkpSR988IG2bNmitm3bVvs+a8SRqnfffVfBwcGKjY01l/Xq1Uve3t5KT083l2VlZenIkSOKioqSJEVFRWnfvn0uV+mlpaXJZrMpIiLCrLl8G6U1pdvw8fFRr169XGpKSkqUnp5u1lSmFwAAUHMkJibqr3/9q5YvX64mTZrI4XDI4XDo/Pnz1bdTw82Ki4uNVq1aGRMnTiwz9vzzzxutWrUyNm3aZOzevduIiooyoqKizPFLly4Zt912mzFgwABj7969RmpqqhEUFGRMnjzZrPnmm2+Mhg0bGhMmTDC++OILY+HChYaXl5eRmppq1rz33nuGr6+vkZKSYhw8eNAYNWqUERAQYDgcjkr3Uhn5+fmGJCM/P/+61qvpio91rPINAFBznT9/3jh48KBx/vx5d7dy3SSVe3v33XfLrb/WY63s57fbv/7buHGjjhw5opEjR5YZmzNnjjw9PRUXF6fCwkLFxMRo0aJF5riXl5fWrFmj0aNHKyoqSo0aNVJ8fLxmzJhh1rRt21Zr167V+PHjNW/ePLVs2VJvv/22YmJizJqhQ4fqxIkTmjJlihwOh3r27KnU1FSXk9cr6gUAANQchhtmjKpR81TVdcxTVRbzVAFAzXWtuZvqmjo1TxUAAEBtRqgCAACwAKEKAADAAoQqAABwTfXh9GsrHiOhCgAAlMvb21uS9OOPP7q5k+pX+hhLH3NVuH1KBQAAUDN5eXkpICDAnGS7YcOG8vDwcHNX1jIMQz/++KOOHz+ugIAAeXl5VXlbhCoAAHBVpT/Hdvmvl9RFAQEB1/zpucogVAEAgKvy8PBQixYtFBwcrIsXL7q7nWrh7e19Q0eoShGqAABAhby8vCwJHnUZJ6oDAABYgFAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAGmVIBKHLe6uwUAAGo9jlQBAABYgFAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABYgVAEAAFiAUAUAAGABQhUAAIAFCFUAAAAWIFQBAABYgFAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABZwe6j64Ycf9OSTT6pZs2by9/dXt27dtHv3bnPcMAxNmTJFLVq0kL+/v6Kjo/XVV1+5bOP06dN64oknZLPZFBAQoISEBJ07d86l5vPPP9c999wjPz8/hYeHa9asWWV6WbVqlTp37iw/Pz9169ZN69atcxmvTC8AAKB+cmuoOnPmjO666y55e3tr/fr1OnjwoN588001bdrUrJk1a5bmz5+vJUuWaMeOHWrUqJFiYmJ04cIFs+aJJ57QgQMHlJaWpjVr1mjbtm0aNWqUOe50OjVgwAC1bt1amZmZmj17tqZNm6alS5eaNdu3b9fjjz+uhIQE/c///I8GDx6swYMHa//+/dfVCwAAqJ88DMMw3LXzSZMm6dNPP9W//vWvcscNw1BYWJhefPFFvfTSS5Kk/Px8hYSEKCUlRcOGDdMXX3yhiIgI7dq1S71795Ykpaam6sEHH9T333+vsLAwLV68WK+88oocDod8fHzMfa9evVqHDh2SJA0dOlQFBQVas2aNuf9+/fqpZ8+eWrJkSaV6qYjT6ZTdbld+fr5sNlvVnziLlThuddu+PUO/dNu+AQCojMp+frv1SNVHH32k3r1767HHHlNwcLBuv/12/ed//qc5np2dLYfDoejoaHOZ3W5XZGSkMjIyJEkZGRkKCAgwA5UkRUdHy9PTUzt27DBr7r33XjNQSVJMTIyysrJ05swZs+by/ZTWlO6nMr1cqbCwUE6n0+UGAADqJreGqm+++UaLFy9Wx44dtWHDBo0ePVpjx47VsmXLJEkOh0OSFBIS4rJeSEiIOeZwOBQcHOwy3qBBAwUGBrrUlLeNy/dxtZrLxyvq5UozZ86U3W43b+Hh4RU9JQAAoJZya6gqKSnRHXfcod///ve6/fbbNWrUKD377LNasmSJO9uyzOTJk5Wfn2/ejh496u6WAABANXFrqGrRooUiIiJclnXp0kVHjhyRJIWGhkqScnNzXWpyc3PNsdDQUB0/ftxl/NKlSzp9+rRLTXnbuHwfV6u5fLyiXq7k6+srm83mcgMAAHWTW0PVXXfdpaysLJdlX375pVq3bi1Jatu2rUJDQ5Wenm6OO51O7dixQ1FRUZKkqKgo5eXlKTMz06zZtGmTSkpKFBkZadZs27ZNFy9eNGvS0tLUqVMn80rDqKgol/2U1pTupzK9AACA+sutoWr8+PH67LPP9Pvf/16HDx/W8uXLtXTpUiUmJkqSPDw8NG7cOL3++uv66KOPtG/fPj399NMKCwvT4MGDJf10ZGvgwIF69tlntXPnTn366acaM2aMhg0bprCwMEnSr3/9a/n4+CghIUEHDhzQihUrNG/ePCUnJ5u9vPDCC0pNTdWbb76pQ4cOadq0adq9e7fGjBlT6V4AAED95dYpFSRpzZo1mjx5sr766iu1bdtWycnJevbZZ81xwzA0depULV26VHl5ebr77ru1aNEi3Xrr/58G4PTp0xozZow+/vhjeXp6Ki4uTvPnz1fjxo3Nms8//1yJiYnatWuXmjdvrqSkJE2cONGll1WrVunVV1/Vt99+q44dO2rWrFl68MEHr6uXa2FKhbKYUgEAUNNV9vPb7aGqPiFUlUWoAgDUdLVinioAAIC6glAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABYgVAEAAFiAUAUAAGABQhUAAIAFCFUAAAAWIFQBAABYgFAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABZo4O4GUPt1WPlcldf9ZqyFjQAA4EYcqQIAALAAoQoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAKEKgAAAAsQqgAAACxAqAIAALAAoQoAAMAChCoAAAALuDVUTZs2TR4eHi63zp07m+MXLlxQYmKimjVrpsaNGysuLk65ubku2zhy5IhiY2PVsGFDBQcHa8KECbp06ZJLzZYtW3THHXfI19dXHTp0UEpKSpleFi5cqDZt2sjPz0+RkZHauXOny3hlegEAAPWX249Ude3aVceOHTNv//73v82x8ePH6+OPP9aqVau0detW5eTk6NFHHzXHi4uLFRsbq6KiIm3fvl3Lli1TSkqKpkyZYtZkZ2crNjZW/fv31969ezVu3Dg988wz2rBhg1mzYsUKJScna+rUqdqzZ4969OihmJgYHT9+vNK9AACA+s3DMAzDXTufNm2aVq9erb1795YZy8/PV1BQkJYvX64hQ4ZIkg4dOqQuXbooIyND/fr10/r16/XQQw8pJydHISEhkqQlS5Zo4sSJOnHihHx8fDRx4kStXbtW+/fvN7c9bNgw5eXlKTU1VZIUGRmpPn36aMGCBZKkkpIShYeHKykpSZMmTapUL5XhdDplt9uVn58vm81W5efNaiWOW29o/Q4rn6vyut+MffGG9g0AQHWr7Oe3249UffXVVwoLC1O7du30xBNP6MiRI5KkzMxMXbx4UdHR0WZt586d1apVK2VkZEiSMjIy1K1bNzNQSVJMTIycTqcOHDhg1ly+jdKa0m0UFRUpMzPTpcbT01PR0dFmTWV6KU9hYaGcTqfLDQAA1E1uDVWRkZFKSUlRamqqFi9erOzsbN1zzz06e/asHA6HfHx8FBAQ4LJOSEiIHA6HJMnhcLgEqtLx0rFr1TidTp0/f14nT55UcXFxuTWXb6OiXsozc+ZM2e128xYeHl65JwYAANQ6Ddy580GDBpl/7t69uyIjI9W6dWutXLlS/v7+buzMGpMnT1ZycrJ53+l0EqwAAKij3P713+UCAgJ066236vDhwwoNDVVRUZHy8vJcanJzcxUaGipJCg0NLXMFXun9impsNpv8/f3VvHlzeXl5lVtz+TYq6qU8vr6+stlsLjcAAFA31ahQde7cOX399ddq0aKFevXqJW9vb6Wnp5vjWVlZOnLkiKKioiRJUVFR2rdvn8tVemlpabLZbIqIiDBrLt9GaU3pNnx8fNSrVy+XmpKSEqWnp5s1lekFAADUb279+u+ll17Sww8/rNatWysnJ0dTp06Vl5eXHn/8cdntdiUkJCg5OVmBgYGy2WxKSkpSVFSUebXdgAEDFBERoaeeekqzZs2Sw+HQq6++qsTERPn6+kqSnn/+eS1YsEAvv/yyRo4cqU2bNmnlypVau3at2UdycrLi4+PVu3dv9e3bV3PnzlVBQYFGjBghSZXqBQAA1G9uDVXff/+9Hn/8cZ06dUpBQUG6++679dlnnykoKEiSNGfOHHl6eiouLk6FhYWKiYnRokWLzPW9vLy0Zs0ajR49WlFRUWrUqJHi4+M1Y8YMs6Zt27Zau3atxo8fr3nz5qlly5Z6++23FRMTY9YMHTpUJ06c0JQpU+RwONSzZ0+lpqa6nLxeUS8AAKB+c+s8VfUN81SVxTxVAICartbMUwUAAFAXEKoAAAAsQKgCAACwAKEKAADAAoQqAAAAC7h1SgXgRq489Az90sJOAAC4MRypAgAAsAChCgAAwAKEKgAAAAsQqgAAACxAqAIAALAAV//hhn67DwAA/IQjVQAAABYgVAEAAFiAUAUAAGABQhUAAIAFCFUAAAAWIFQBAABYgFAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABYgVAEAAFigSqGqXbt2OnXqVJnleXl5ateu3Q03BQAAUNtUKVR9++23Ki4uLrO8sLBQP/zwww03BQAAUNs0uJ7ijz76yPzzhg0bZLfbzfvFxcVKT09XmzZtLGsOAACgtriuUDV48GBJkoeHh+Lj413GvL291aZNG7355puWNQcAAFBbXFeoKikpkSS1bdtWu3btUvPmzaulKQAAgNrmukJVqezsbKv7AAAAqNWqFKokKT09Xenp6Tp+/Lh5BKvUO++8c8ONAQAA1CZVClXTp0/XjBkz1Lt3b7Vo0UIeHh5W9wUAAFCrVClULVmyRCkpKXrqqaes7gcAAKBWqtI8VUVFRbrzzjut7gUAAKDWqlKoeuaZZ7R8+XJLG3njjTfk4eGhcePGmcsuXLigxMRENWvWTI0bN1ZcXJxyc3Nd1jty5IhiY2PVsGFDBQcHa8KECbp06ZJLzZYtW3THHXfI19dXHTp0UEpKSpn9L1y4UG3atJGfn58iIyO1c+dOl/HK9AIAAOqvKn39d+HCBS1dulQbN25U9+7d5e3t7TL+pz/96bq2t2vXLv35z39W9+7dXZaPHz9ea9eu1apVq2S32zVmzBg9+uij+vTTTyX9NOFobGysQkNDtX37dh07dkxPP/20vL299fvf/17ST1cqxsbG6vnnn9ff/vY3paen65lnnlGLFi0UExMjSVqxYoWSk5O1ZMkSRUZGau7cuYqJiVFWVpaCg4Mr1QsAAKjfPAzDMK53pf79+199gx4e2rRpU6W3de7cOd1xxx1atGiRXn/9dfXs2VNz585Vfn6+goKCtHz5cg0ZMkSSdOjQIXXp0kUZGRnq16+f1q9fr4ceekg5OTkKCQmR9NP5XhMnTtSJEyfk4+OjiRMnau3atdq/f7+5z2HDhikvL0+pqamSpMjISPXp00cLFiyQ9NN8XOHh4UpKStKkSZMq1UtlOJ1O2e125efny2azVfo5qm7t5rtvwtbDv/pzldf1DP3Swk4AAChfZT+/q3SkavPmzVVu7EqJiYmKjY1VdHS0Xn/9dXN5ZmamLl68qOjoaHNZ586d1apVKzPIZGRkqFu3bmagkqSYmBiNHj1aBw4c0O23366MjAyXbZTWlH7NWFRUpMzMTE2ePNkc9/T0VHR0tDIyMirdS3kKCwtVWFho3nc6nVV4hgAAQG1Q5XmqrPDee+9pz5492rVrV5kxh8MhHx8fBQQEuCwPCQmRw+Eway4PVKXjpWPXqnE6nTp//rzOnDmj4uLicmsOHTpU6V7KM3PmTE2fPv2q4wAAoO6oUqjq37//NeemqszXf0ePHtULL7ygtLQ0+fn5VaWNGm/y5MlKTk427zudToWHh7uxIwAAUF2qFKp69uzpcv/ixYvau3ev9u/fX+aHlq8mMzNTx48f1x133GEuKy4u1rZt27RgwQJt2LBBRUVFysvLczlClJubq9DQUElSaGhomav0Sq/Iu7zmyqv0cnNzZbPZ5O/vLy8vL3l5eZVbc/k2KuqlPL6+vvL19a3U8wEAAGq3KoWqOXPmlLt82rRpOnfuXKW28cADD2jfvn0uy0aMGKHOnTtr4sSJCg8Pl7e3t9LT0xUXFydJysrK0pEjRxQVFSVJioqK0u9+9zsdP37cvEovLS1NNptNERERZs26detc9pOWlmZuw8fHR7169VJ6eroGDx4s6acT1dPT0zVmzBhJUq9evSrsBQAA1G+WnlP15JNPqm/fvvrjH/9YYW2TJk102223uSxr1KiRmjVrZi5PSEhQcnKyAgMDZbPZlJSUpKioKPPE8AEDBigiIkJPPfWUZs2aJYfDoVdffVWJiYnmEaLnn39eCxYs0Msvv6yRI0dq06ZNWrlypdauXWvuNzk5WfHx8erdu7f69u2ruXPnqqCgQCNGjJAk2e32CnsBAAD1m6WhKiMjw9Lzo+bMmSNPT0/FxcWpsLBQMTExWrRokTnu5eWlNWvWaPTo0YqKilKjRo0UHx+vGTNmmDVt27bV2rVrNX78eM2bN08tW7bU22+/bc5RJUlDhw7ViRMnNGXKFDkcDvXs2VOpqakuJ69X1AsAAKjfqjRP1aOPPupy3zAMHTt2TLt379Zrr72mqVOnWtZgXcI8VWUxTxUAoKar1nmq7Ha7y31PT0916tRJM2bM0IABA6qySQAAgFqtSqHq3XfftboPAACAWu2GzqnKzMzUF198IUnq2rWrbr/9dkuaAgAAqG2qFKqOHz+uYcOGacuWLea8TXl5eerfv7/ee+89BQUFWdkjAABAjedZlZWSkpJ09uxZHThwQKdPn9bp06e1f/9+OZ1OjR071uoeAQAAarwqHalKTU3Vxo0b1aVLF3NZRESEFi5cyInqAACgXqrSkaqSkhJ5e3uXWe7t7a2SkpIbbgoAAKC2qVKo+tnPfqYXXnhBOTk55rIffvhB48eP1wMPPGBZcwAAALVFlULVggUL5HQ61aZNG7Vv317t27dX27Zt5XQ69dZbb1ndIwAAQI1XpXOqwsPDtWfPHm3cuFGHDh2SJHXp0kXR0dGWNgcAAFBbXNeRqk2bNikiIkJOp1MeHh76+c9/rqSkJCUlJalPnz7q2rWr/vWvf1VXrwAAADXWdYWquXPn6tlnny33d2/sdruee+45/elPf7KsOQAAgNriukLV//7v/2rgwIFXHR8wYIAyMzNvuCkAAIDa5rpCVW5ubrlTKZRq0KCBTpw4ccNNAQAA1DbXFapuueUW7d+//6rjn3/+uVq0aHHDTQEAANQ21xWqHnzwQb322mu6cOFCmbHz589r6tSpeuihhyxrDgAAoLa4rikVXn31Vf3zn//UrbfeqjFjxqhTp06SpEOHDmnhwoUqLi7WK6+8Ui2NAgAA1GTXFapCQkK0fft2jR49WpMnT5ZhGJIkDw8PxcTEaOHChQoJCamWRlE3dVj5XJXX/Ybf7gYA1CDXPfln69attW7dOp05c0aHDx+WYRjq2LGjmjZtWh39AQAA1ApVmlFdkpo2bao+ffpY2QsAAECtVaXf/gMAAIArQhUAAIAFCFUAAAAWIFQBAABYgFAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABYgVAEAAFiAUAUAAGABQhUAAIAFCFUAAAAWIFQBAABYwK2havHixerevbtsNptsNpuioqK0fv16c/zChQtKTExUs2bN1LhxY8XFxSk3N9dlG0eOHFFsbKwaNmyo4OBgTZgwQZcuXXKp2bJli+644w75+vqqQ4cOSklJKdPLwoUL1aZNG/n5+SkyMlI7d+50Ga9MLwAAoP5ya6hq2bKl3njjDWVmZmr37t362c9+pl/84hc6cOCAJGn8+PH6+OOPtWrVKm3dulU5OTl69NFHzfWLi4sVGxuroqIibd++XcuWLVNKSoqmTJli1mRnZys2Nlb9+/fX3r17NW7cOD3zzDPasGGDWbNixQolJydr6tSp2rNnj3r06KGYmBgdP37crKmoFwAAUL95GIZhuLuJywUGBmr27NkaMmSIgoKCtHz5cg0ZMkSSdOjQIXXp0kUZGRnq16+f1q9fr4ceekg5OTkKCQmRJC1ZskQTJ07UiRMn5OPjo4kTJ2rt2rXav3+/uY9hw4YpLy9PqampkqTIyEj16dNHCxYskCSVlJQoPDxcSUlJmjRpkvLz8yvspTKcTqfsdrvy8/Nls9kse85uVLv5b7q7hSr5ZuyL7m4BAFAPVPbzu8acU1VcXKz33ntPBQUFioqKUmZmpi5evKjo6GizpnPnzmrVqpUyMjIkSRkZGerWrZsZqCQpJiZGTqfTPNqVkZHhso3SmtJtFBUVKTMz06XG09NT0dHRZk1leilPYWGhnE6nyw0AANRNbg9V+/btU+PGjeXr66vnn39eH3zwgSIiIuRwOOTj46OAgACX+pCQEDkcDkmSw+FwCVSl46Vj16pxOp06f/68Tp48qeLi4nJrLt9GRb2UZ+bMmbLb7eYtPDy8ck8KAACoddweqjp16qS9e/dqx44dGj16tOLj43Xw4EF3t2WJyZMnKz8/37wdPXrU3S0BAIBq0sDdDfj4+KhDhw6SpF69emnXrl2aN2+ehg4dqqKiIuXl5bkcIcrNzVVoaKgkKTQ0tMxVeqVX5F1ec+VVerm5ubLZbPL395eXl5e8vLzKrbl8GxX1Uh5fX1/5+vpex7MBAABqK7cfqbpSSUmJCgsL1atXL3l7eys9Pd0cy8rK0pEjRxQVFSVJioqK0r59+1yu0ktLS5PNZlNERIRZc/k2SmtKt+Hj46NevXq51JSUlCg9Pd2sqUwvAACgfnPrkarJkydr0KBBatWqlc6ePavly5dry5Yt2rBhg+x2uxISEpScnKzAwEDZbDYlJSUpKirKvNpuwIABioiI0FNPPaVZs2bJ4XDo1VdfVWJionmE6Pnnn9eCBQv08ssva+TIkdq0aZNWrlyptWvXmn0kJycrPj5evXv3Vt++fTV37lwVFBRoxIgRklSpXgAAQP3m1lB1/PhxPf300zp27Jjsdru6d++uDRs26Oc//7kkac6cOfL09FRcXJwKCwsVExOjRYsWmet7eXlpzZo1Gj16tKKiotSoUSPFx8drxowZZk3btm21du1ajR8/XvPmzVPLli319ttvKyYmxqwZOnSoTpw4oSlTpsjhcKhnz55KTU11OXm9ol4AAED9VuPmqarLmKfKWsxTBQC4GWrdPFUAAAC1GaEKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAJu/5kaoKpKHLdWeV3P0C8t7AQAAI5UAQAAWIJQBQAAYAFCFQAAgAUIVQAAABYgVAEAAFiAUAUAAGABQhUAAIAFCFUAAAAWIFQBAABYgFAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABYgVAEAAFiAUAUAAGABQhUAAIAFCFUAAAAWIFQBAABYgFAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABYgVAEAAFjAraFq5syZ6tOnj5o0aaLg4GANHjxYWVlZLjUXLlxQYmKimjVrpsaNGysuLk65ubkuNUeOHFFsbKwaNmyo4OBgTZgwQZcuXXKp2bJli+644w75+vqqQ4cOSklJKdPPwoUL1aZNG/n5+SkyMlI7d+687l4AAED95NZQtXXrViUmJuqzzz5TWlqaLl68qAEDBqigoMCsGT9+vD7++GOtWrVKW7duVU5Ojh599FFzvLi4WLGxsSoqKtL27du1bNkypaSkaMqUKWZNdna2YmNj1b9/f+3du1fjxo3TM888ow0bNpg1K1asUHJysqZOnao9e/aoR48eiomJ0fHjxyvdCwAAqL88DMMw3N1EqRMnTig4OFhbt27Vvffeq/z8fAUFBWn58uUaMmSIJOnQoUPq0qWLMjIy1K9fP61fv14PPfSQcnJyFBISIklasmSJJk6cqBMnTsjHx0cTJ07U2rVrtX//fnNfw4YNU15enlJTUyVJkZGR6tOnjxYsWCBJKikpUXh4uJKSkjRp0qRK9VIRp9Mpu92u/Px82Ww2S5+7G9Fu/pvubqFKDv/qz1Ve1zP0Sws7AQDUZZX9/G5wE3uqUH5+viQpMDBQkpSZmamLFy8qOjrarOncubNatWplBpmMjAx169bNDFSSFBMTo9GjR+vAgQO6/fbblZGR4bKN0ppx48ZJkoqKipSZmanJkyeb456enoqOjlZGRkale7lSYWGhCgsLzftOp7OqTw3K0WHlc1Ve95uxFjYCAIBq0InqJSUlGjdunO666y7ddtttkiSHwyEfHx8FBAS41IaEhMjhcJg1lweq0vHSsWvVOJ1OnT9/XidPnlRxcXG5NZdvo6JerjRz5kzZ7XbzFh4eXslnAwAA1DY1JlQlJiZq//79eu+999zdimUmT56s/Px883b06FF3twQAAKpJjfj6b8yYMVqzZo22bdumli1bmstDQ0NVVFSkvLw8lyNEubm5Cg0NNWuuvEqv9Iq8y2uuvEovNzdXNptN/v7+8vLykpeXV7k1l2+jol6u5OvrK19f3+t4JgAAQG3l1iNVhmFozJgx+uCDD7Rp0ya1bdvWZbxXr17y9vZWenq6uSwrK0tHjhxRVFSUJCkqKkr79u1zuUovLS1NNptNERERZs3l2yitKd2Gj4+PevXq5VJTUlKi9PR0s6YyvQAAgPrLrUeqEhMTtXz5cn344Ydq0qSJeW6S3W6Xv7+/7Ha7EhISlJycrMDAQNlsNiUlJSkqKso8MXzAgAGKiIjQU089pVmzZsnhcOjVV19VYmKieZTo+eef14IFC/Tyyy9r5MiR2rRpk1auXKm1a9eavSQnJys+Pl69e/dW3759NXfuXBUUFGjEiBFmTxX1AgAA6i+3hqrFixdLku6//36X5e+++66GDx8uSZozZ448PT0VFxenwsJCxcTEaNGiRWatl5eX1qxZo9GjRysqKkqNGjVSfHy8ZsyYYda0bdtWa9eu1fjx4zVv3jy1bNlSb7/9tmJiYsyaoUOH6sSJE5oyZYocDod69uyp1NRUl5PXK+oFAADUXzVqnqq6jnmqao5vxr7o7hYAALVEZT+/a8zVfwAAALUZoQoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAKEKgAAAAu49QeVAXcpcdxa5XU9Q7+0sBMAQF3BkSoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAKEKgAAAAsQqgAAACxAqAIAALAAoQoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACzRwdwOAO3RY+VyV1/1mrIWNAADqDI5UAQAAWIBQBQAAYAFCFQAAgAUIVQAAABYgVAEAAFiAUAUAAGABt4aqbdu26eGHH1ZYWJg8PDy0evVql3HDMDRlyhS1aNFC/v7+io6O1ldffeVSc/r0aT3xxBOy2WwKCAhQQkKCzp0751Lz+eef65577pGfn5/Cw8M1a9asMr2sWrVKnTt3lp+fn7p166Z169Zddy8AAKD+cmuoKigoUI8ePbRw4cJyx2fNmqX58+dryZIl2rFjhxo1aqSYmBhduHDBrHniiSd04MABpaWlac2aNdq2bZtGjRpljjudTg0YMECtW7dWZmamZs+erWnTpmnp0qVmzfbt2/X4448rISFB//M//6PBgwdr8ODB2r9//3X1AgAA6i8PwzAMdzchSR4eHvrggw80ePBgST8dGQoLC9OLL76ol156SZKUn5+vkJAQpaSkaNiwYfriiy8UERGhXbt2qXfv3pKk1NRUPfjgg/r+++8VFhamxYsX65VXXpHD4ZCPj48kadKkSVq9erUOHTokSRo6dKgKCgq0Zs0as59+/fqpZ8+eWrJkSaV6qQyn0ym73a78/HzZbDZLnjcrtJv/prtbqFUO/+rPVV7XM/RLCzsBANwMlf38rrHnVGVnZ8vhcCg6OtpcZrfbFRkZqYyMDElSRkaGAgICzEAlSdHR0fL09NSOHTvMmnvvvdcMVJIUExOjrKwsnTlzxqy5fD+lNaX7qUwv5SksLJTT6XS5AQCAuqnGhiqHwyFJCgkJcVkeEhJijjkcDgUHB7uMN2jQQIGBgS415W3j8n1creby8Yp6Kc/MmTNlt9vNW3h4eAWPGgAA1FY1NlTVBZMnT1Z+fr55O3r0qLtbAgAA1aTGhqrQ0FBJUm5ursvy3Nxccyw0NFTHjx93Gb906ZJOnz7tUlPeNi7fx9VqLh+vqJfy+Pr6ymazudwAAEDdVGNDVdu2bRUaGqr09HRzmdPp1I4dOxQVFSVJioqKUl5enjIzM82aTZs2qaSkRJGRkWbNtm3bdPHiRbMmLS1NnTp1UtOmTc2ay/dTWlO6n8r0AgAA6je3hqpz585p79692rt3r6SfTgjfu3evjhw5Ig8PD40bN06vv/66PvroI+3bt09PP/20wsLCzCsEu3TpooEDB+rZZ5/Vzp079emnn2rMmDEaNmyYwsLCJEm//vWv5ePjo4SEBB04cEArVqzQvHnzlJycbPbxwgsvKDU1VW+++aYOHTqkadOmaffu3RozZowkVaoXAABQvzVw5853796t/v37m/dLg058fLxSUlL08ssvq6CgQKNGjVJeXp7uvvtupaamys/Pz1znb3/7m8aMGaMHHnhAnp6eiouL0/z5881xu92uTz75RImJierVq5eaN2+uKVOmuMxldeedd2r58uV69dVX9Zvf/EYdO3bU6tWrddttt5k1lekFAADUXzVmnqr6gHmq6gbmqQKA+qWyn99uPVIF65Q4br2BtZ+zrA8AAOqrGnuiOgAAQG1CqAIAALAAoQoAAMACnFMFXKcOK6t+Dto3Yy1sBABQo3CkCgAAwAKEKgAAAAvw9R9wE93I1BfMcQUANRtHqgAAACxAqAIAALAAoQoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAsxTVUfcyE+nAACAG0eoAm6iGwm/h3/FxKEAUJPx9R8AAIAFCFUAAAAWIFQBAABYgFAFAABgAU5UB+qBEgcnuQNAdSNUAbXEjV05+GcLOwEAlIev/wAAACzAkSoA18RXhwBQOYQqAHUOQRCAOxCqgHqgNp6PdSPBCADcgVAFoNrUxmDEUS4AVUWoAnBNtfEol7sQyFDT8Hfy5iJUAahzbiQI3oj6FiIBuCJUAag27go3tRFHFHA17voanb+T149QBQAW4atS1DT8nby5CFUAUMtxRAHV4UYC2TdjLWykFiFUAUANwBEFXE1t/Bq9vgZ9QhUA1HIcUaj5buy8qNoXquorQhUA1GP19YgCqld9DfqEquu0cOFCzZ49Ww6HQz169NBbb72lvn37urstAKiS+vrhd7PVxq/wcP0IVddhxYoVSk5O1pIlSxQZGam5c+cqJiZGWVlZCg4Odnd7AHBT1cYZ828EwQgV8TAMw3B3E7VFZGSk+vTpowULFkiSSkpKFB4erqSkJE2aNKnC9Z1Op+x2u/Lz82Wz2Sztrd38Ny3dHgAAtc03Y1+slu1W9vObI1WVVFRUpMzMTE2ePNlc5unpqejoaGVkZJS7TmFhoQoLC837+fn5kn56caxWcuGC5dsEAKA2qY7P18u3W9FxKEJVJZ08eVLFxcUKCQlxWR4SEqJDhw6Vu87MmTM1ffr0MsvDw8OrpUcAAOoz+8RXq3X7Z8+eld1uv+o4oaoaTZ48WcnJyeb9kpISnT59Ws2aNZOHh8dN68PpdCo8PFxHjx61/GtHVA9es9qH16z24TWrfdz1mhmGobNnzyosLOyadYSqSmrevLm8vLyUm5vrsjw3N1ehoaHlruPr6ytfX1+XZQEBAdXVYoVsNhv/46hleM1qH16z2ofXrPZxx2t2rSNUpTxvQh91go+Pj3r16qX09HRzWUlJidLT0xUVFeXGzgAAQE3AkarrkJycrPj4ePXu3Vt9+/bV3LlzVVBQoBEjRri7NQAA4GaEquswdOhQnThxQlOmTJHD4VDPnj2Vmppa5uT1msbX11dTp04t81Ukai5es9qH16z24TWrfWr6a8Y8VQAAABbgnCoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACxCq6riFCxeqTZs28vPzU2RkpHbu3OnulnAN06ZNk4eHh8utc+fO7m4Ll9m2bZsefvhhhYWFycPDQ6tXr3YZNwxDU6ZMUYsWLeTv76/o6Gh99dVX7mkWkip+zYYPH17mfTdw4ED3NAvNnDlTffr0UZMmTRQcHKzBgwcrKyvLpebChQtKTExUs2bN1LhxY8XFxZX5xRN3IFTVYStWrFBycrKmTp2qPXv2qEePHoqJidHx48fd3RquoWvXrjp27Jh5+/e//+3ulnCZgoIC9ejRQwsXLix3fNasWZo/f76WLFmiHTt2qFGjRoqJidGFCxducqcoVdFrJkkDBw50ed/9/e9/v4kd4nJbt25VYmKiPvvsM6WlpenixYsaMGCACgoKzJrx48fr448/1qpVq7R161bl5OTo0UcfdWPX/8dAndW3b18jMTHRvF9cXGyEhYUZM2fOdGNXuJapU6caPXr0cHcbqCRJxgcffGDeLykpMUJDQ43Zs2eby/Ly8gxfX1/j73//uxs6xJWufM0MwzDi4+ONX/ziF27pBxU7fvy4IcnYunWrYRg/vae8vb2NVatWmTVffPGFIcnIyMhwV5uGYRgGR6rqqKKiImVmZio6Otpc5unpqejoaGVkZLixM1Tkq6++UlhYmNq1a6cnnnhCR44ccXdLqKTs7Gw5HA6X953dbldkZCTvuxpuy5YtCg4OVqdOnTR69GidOnXK3S3h/+Tn50uSAgMDJUmZmZm6ePGiy/usc+fOatWqldvfZ4SqOurkyZMqLi4u8xM6ISEhcjgcbuoKFYmMjFRKSopSU1O1ePFiZWdn65577tHZs2fd3RoqofS9xfuudhk4cKD++7//W+np6frDH/6grVu3atCgQSouLnZ3a/VeSUmJxo0bp7vuuku33XabpJ/eZz4+PgoICHCprQnvM377D6hBBg0aZP65e/fuioyMVOvWrbVy5UolJCS4sTOg7ho2bJj5527duql79+5q3769tmzZogceeMCNnSExMVH79++vNeeWcqSqjmrevLm8vLzKXA2Rm5ur0NBQN3WF6xUQEKBbb71Vhw8fdncrqITS9xbvu9qtXbt2at68Oe87NxszZozWrFmjzZs3q2XLluby0NBQFRUVKS8vz6W+JrzPCFV1lI+Pj3r16qX09HRzWUlJidLT0xUVFeXGznA9zp07p6+//lotWrRwdyuohLZt2yo0NNTlfed0OrVjxw7ed7XI999/r1OnTvG+cxPDMDRmzBh98MEH2rRpk9q2besy3qtXL3l7e7u8z7KysnTkyBG3v8/4+q8OS05OVnx8vHr37q2+fftq7ty5Kigo0IgRI9zdGq7ipZde0sMPP6zWrVsrJydHU6dOlZeXlx5//HF3t4b/c+7cOZcjGNnZ2dq7d68CAwPVqlUrjRs3Tq+//ro6duyotm3b6rXXXlNYWJgGDx7svqbruWu9ZoGBgZo+fbri4uIUGhqqr7/+Wi+//LI6dOigmJgYN3ZdfyUmJmr58uX68MMP1aRJE/M8KbvdLn9/f9ntdiUkJCg5OVmBgYGy2WxKSkpSVFSU+vXr597m3XrtIardW2+9ZbRq1crw8fEx+vbta3z22WfubgnXMHToUKNFixaGj4+PccsttxhDhw41Dh8+7O62cJnNmzcbksrc4uPjDcP4aVqF1157zQgJCTF8fX2NBx54wMjKynJv0/XctV6zH3/80RgwYIARFBRkeHt7G61btzaeffZZw+FwuLvtequ810qS8e6775o158+fN/7jP/7DaNq0qdGwYUPjl7/8pXHs2DH3Nf1/PAzDMG5+lAMAAKhbOKcKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAKEKgAAAAsQqgAAACxAqAIAALAAoQoAAMAChCoAAAALEKoAAAAs8P8AxSKQdOl2JZYAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "(\n",
    "    ggplot(\"taxi_no_outliers\", aes(x=\"trip_distance\"), with_=\"taxi_no_outliers\")\n",
    "    + geom_histogram(bins=30, fill=\"vendorid\")\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e2317e18-30a2-4b04-b889-40c3d66c9077",
   "metadata": {},
   "source": [
    "## Using a native connection\n",
    "\n",
    "Using a native connection is also supported."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "34c3db55-3631-42a1-b43e-670e7e4e7b96",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install redshift-connector --quiet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "ca437a56-a06e-4669-ba47-26d74701ddd5",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import redshift_connector\n",
    "\n",
    "conn = redshift_connector.connect(\n",
    "    host=host,\n",
    "    database=\"dev\",\n",
    "    port=5439,\n",
    "    user=user,\n",
    "    password=password,\n",
    "    timeout=60,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "a36dc846-aa1d-485d-bd71-798960f309e7",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%sql conn --alias redshift-native"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
